什么是bnez MIPS指令的编码?

时间:2014-04-05 00:39:44

标签: mips

如果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位

1 个答案:

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

Source

所以它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字节。
  • 但是我们需要再添加一个字,因为在MIPS PC中已经增加了4并且当BNEZ正在执行时,PC已经指向下一条指令(参见delay slot in MIPS)。所以最终的偏移是-20 = - (0x14)= 0xFFFEC。
  • 我们右移2个位置(除以4)以(而不是字节)获得此偏移:0xFFFEC>> 2 = 0xFFFB

您也可以直接用单词计算:

  • Loop地址是来自BNEZ指令的-4条指令
  • 附加-1,因为PC已经增加:-5
  • -5 = - (0x5)= 0xFFFB

所以我们得到了i部分的0xFFFB;所以整个指令是0x1500FFFB

顺便说一句,您可以使用任何MIPS汇编程序或simulator进行检查。

(来自MARS模拟器的屏幕截图)

MARS simulator, Text segment view