将 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
鉴于此代码:
[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