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 回答