将 Mips 汇编翻译成机器代码:BNE

Translating Mips assembly to machine code: BNE

鉴于此代码:

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

现在我有兴趣将 bne 命令行翻译成机器码:

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

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

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

知道为什么吗?**

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

因此,对于给定的字节偏移量,它在分支中通过将其右移 2 [即较低的两位 必须 始终为零,因此不会丢失任何内容]。执行指令时,硬件将取偏移量并将其左移 2 位恢复为字节偏移量。

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

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

由于编码后的偏移量只有一个有符号的 16 位,我们最终得到 0xFFFB