0

MIPS で次の C コードを複製しようとしています。

//sum, n and added are integers and have already been initialized
if(n%3 == 0){
    sum = sum + n;    
    added = added + 1;
}

これが私がやってたものです。

#Let t0 = n
#Let s0 = sum
#Let a0 = added
#All have been set earlier in the program

addi $t1, $zero, 3    #Let t1 = 3 for division
div $t0, $t1          #Remainder will be stored in $HI
bne $HI, $zero, ENDIF #skip to ENDIF when remainder != 0; same as if(n%3 == 0)
    add $s0, $s0, $t0
    addi $a0, $a0, 1
ENDIF:

MIPS シミュレーター (QtSpim を使用しています) で実行すると、if ステートメントでコンパイラ エラーが発生します。それは読みます:

bne $HI, $zero, ENDIF #skip to ENDIF when remainder != 0; same as if(n%3 == 0)
     ^

正確には、ステートメントの何が問題になっていますか?^ が $HI の下にあることがわかります。div ステートメントに何か問題があり、$HI でエラーが発生していますか? または、そのようなブランチでは $HI を使用できませんか? $HI を一時レジスターに移動する必要がありますか? それともとにかく分岐文に何か問題がありますか?

助けてくれてありがとう!

4

2 に答える 2

1

はい、レジスタに移動する必要があります$HI(MIPS 分岐命令はレジスタを比較します)。

于 2013-01-21T00:06:27.527 に答える
1

HI レジスタに直接アクセスすることはできませんmfhi。値を取得するために使用します。

#Let t0 = n
#Let s0 = sum
#Let a0 = added
#All have been set earlier in the program

addi $t1, $zero, 3    #Let t1 = 3 for division
div $t0, $t1          #Remainder will be stored in $HI
mfhi $t2          #Store the value from $HI in $t0
bne $t2, $zero, ENDIF #skip to ENDIF when remainder != 0; same as if(n%3 == 0)
    add $s0, $s0, $t0
    addi $a0, $a0, 1
ENDIF:
于 2013-01-21T00:09:48.040 に答える