0

こんにちは、コンプ用の mips プログラムを書いています。アーチ。私が取っているクラス。教授は私たちに次のように求めました。

65 から 90 までの 4 つの整数の入力を求めるプロンプトが表示され、入力された整数に対応する 4 つの ASCII 文字の文字列が出力されます。たとえば、ユーザーが「65 66 67 and 68」と入力すると、プログラムは「ABCD」と出力します。syscall #4 のみがあり、syscall #11 はないと仮定します。

以下にコードを追加しました。これを実行するたびに、エラーとして 0x004000e8 でランタイム例外が発生します。私が間違っていることへの助けは素晴らしいでしょう、ありがとう。

.data           #data Segment

stringMsg: .asciiz "Enter 4 integers that are between 65-90, inclusive: "
                #Stores string in data segment + null terminator

alphaTable: .byte 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'

    .text

string: 

    li $v0, 4           #Syscall #4 prints string
    la $a0, stringMsg   #Loads address of string "inputMsg"
    syscall             #Prints inputMsg    

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s0, ($v0)       #save first number into s0

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s1, ($v0)       #save second number into s1

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s2, ($v0)       #save third number into s2

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s3, ($v0)       #save fourth number into s3

    sub $s0, $s0, 65    #Subtract 65 from the 4 # to get correlating value in array
    sub $s1, $s1, 65
    sub $s2, $s2, 65
    sub $s3, $s3, 65

    la $s4, alphaTable  #Loads table into $s4   (used to get index val)
    la $s5, alphaTable  #Loads table into $s5   (used to reset index val)


    add $s5, $s5, $s0
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s1
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s2
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s3
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg


exit:
    li $v0, 10          #syscall #10: exit
    syscall             #ends program
4

1 に答える 1

1

2 つの問題があります。例外を与えている最初のものは、印刷する文字を int にロードしていて、印刷する (null で終わる) 文字列のアドレスに$a0必要なサービス 4 を使用していることです。$a0

したがって、行を変更するだけで修正できます

 lb $a0, ($s5)

 move $a0, $s5

または同等のもの (例: add $a0, %s5, $zero)。

ただし、文字列を null で終了する必要もあります。したがって、各文字の後にゼロの ASCII コードを追加し、オフセットを設定するときにその余分なバイトを考慮する必要があります。

したがって、alphaTable次のようになります。

alphaTable: .byte 'A', 0, 'B', 0, 'C', 0, 'D', 0, 'E', 0, 'F', 0, 'G', 0, 'H', 0, 'I', 0, 'J', 0, 'K', 0, 'L', 0, 'M', 0, 'N', 0, 'O', 0, 'P', 0, 'Q', 0, 'R', 0, 'S', 0, 'T', 0, 'U', 0, 'V', 0, 'W', 0, 'X', 0, 'Y', 0, 'Z', 0

また、各オフセットの余分なバイトを考慮するには、印刷する文字のオフセットの 2 倍を追加する必要があります。move $a0, $s5したがって、上記の代わりに、単に発行することができます

add $a0, $s5, $s0

そのため、 ( )$a0のベース アドレスに の値の 2 倍を加えたものが保持されます。alphaTable$s5$s0

于 2014-10-14T15:39:58.070 に答える