将Mips装配转换为机器代码:BNE

时间:2016-05-12 17:15:51

标签: assembly mips machine-code

鉴于此代码:

[0x00000000]  arraycopy: lw $t0, 0($a0)
[0x00000004]             addi $a0, $a0,4
[0x00000008]             addi $a1, $a1,4
[0x0000000C]             sw $t0, -4($a1)
[0x00000010]             bne $t0,$0,arraycopy
[0x00000014]             Nop ( means no operation )

现在我有兴趣将bne命令行转换为机器代码:

我得到了什么: 0001 0100 0000 1000 - ....

现在命令的其余部分是什么?

**更新:我一直认为偏移值为:1111 1111 1110 1100即-20 但正确的答案应该是:0xfffb即-5

任何想法为什么?**

1 个答案:

答案 0 :(得分:1)

因为MIPS指令必须与4字节边界对齐,所以分支指令中的偏移可以编码为[并且 编码]为 offset和字节偏移量。这使分支的可达范围增加4倍[好事]。因此,对于16位的带符号编码偏移,您将获得18位的带符号字节偏移

因此,对于给定的字节偏移量,它通过将其右移2来在分支中进行编码[即低两位必须始终为零,因此不会丢失任何东西。执行该指令时,硬件将采用偏移量并将其向左移2,将其恢复为字节偏移量。

字节偏移量是从分支本身的地址(0x00000010)而不是计算的,而是从(0x00000014)之后的指令的地址计算出来的。

因此,字节偏移是-0x00000014(十进制-20) - > 0xFFFFFFEC。将此右移2位[除以4]会产生0xFFFFFFFB(十进制-5)。

由于编码偏移仅为带符号的16位,因此我们最终得到0xFFFB