鉴于此代码:
[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
任何想法为什么?**
答案 0 :(得分:1)
因为MIPS指令必须与4字节边界对齐,所以分支指令中的偏移可以编码为[并且 编码]为字 offset和不字节偏移量。这使分支的可达范围增加4倍[好事]。因此,对于16位的带符号编码偏移,您将获得18位的带符号字节偏移
因此,对于给定的字节偏移量,它通过将其右移2来在分支中进行编码[即低两位必须始终为零,因此不会丢失任何东西。执行该指令时,硬件将采用偏移量并将其向左移2,将其恢复为字节偏移量。
字节偏移量是从分支本身的地址(0x00000010)而不是计算的,而是从(0x00000014)之后的指令的地址计算出来的。
因此,字节偏移是-0x00000014(十进制-20) - > 0xFFFFFFEC。将此右移2位[除以4]会产生0xFFFFFFFB(十进制-5)。
由于编码偏移仅为带符号的16位,因此我们最终得到0xFFFB