如果Loop的地址是0x00012344,那么最后一条指令的编码是什么?
Loop:
addu $a0, $0, $t0
ori $v0, $0, 4
syscall
addi $t0, $t0, -1
bnez $t0, Loop
这最后一条指令相当于:
bne $t0, $0, Loop
但是,我如何在机器代码中写这个?
这是我得到的:
000101 01000 00000 iiiii iiiii iiiiii
我不知道该怎么做但我在这里。 Loop的地址是0x00012344,但这是一个17位的二进制数。我只有16位
答案 0 :(得分:1)
MIPS中的分支使用偏移(向左移动2个位置),而不是绝对地址。
BNE - 分支不等
描述:
如果两个寄存器不相等则分支
操作:
如果$ s!= $ t advance_pc(偏移<<< 2));否则advance_pc(4);
语法:
bne $ s,$ t,offset
编码:
0001 01ss ssst tttt iiii iiii iiii iiii
所以它Loop
偏离BNE
部分应该放在i
部分,而不是它的绝对地址。
编辑:已修改的问题代码:
Loop:
addu $a0, $0, $t0
ori $v0, $0, 4
syscall
addi $t0, $t0, -1
bnez $t0, Loop
由于所有MIPS指令都是32位宽(4字节),我们可以轻松计算出偏移量:
Loop
地址是来自BNEZ指令的-4条指令,所以它的距离是-4 x 4 = -16字节。 您也可以直接用单词计算:
Loop
地址是来自BNEZ指令的-4条指令所以我们得到了i
部分的0xFFFB;所以整个指令是0x1500FFFB
。
顺便说一句,您可以使用任何MIPS汇编程序或simulator进行检查。
(来自MARS模拟器的屏幕截图)