[英]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,$0,arraycopy
[0x00000014] Nop ( means no operation )
现在,我有兴趣将bne
命令行转换为机器代码:
我得到的是:0001 0100 0000 1000-....
现在剩下的命令是什么?
**更新:我不断得到偏移值是: 1111 1111 1110 1100
,它是-20,但是正确的答案应该是: 0xfffb
,它是-5
知道为什么吗?**
因为MIPS指令必须对齐到4个字节的边界,分支指令中的偏移量可以被编码[和被编码]作为一个字的偏移,而不是一个字节偏移量。 这将分支的可达范围增加了4倍[一件好事]。 因此,对于16位的带符号编码偏移量,您将获得18位的带符号字节偏移量
因此,对于给定的字节偏移,通过将其右移2来在分支中进行编码(即,低两位必须始终为零,因此不会丢失任何内容)。 执行该指令时,硬件将获取偏移量并将其左移2位,将其恢复为字节偏移量。
字节偏移的计算不是根据分支本身的地址(0x00000010),而是根据后续指令的地址(0x00000014)。
因此,字节偏移量为-0x00000014(十进制-20)-> 0xFFFFFFEC。 向右移2位(除以4)将产生0xFFFFFFFB(十进制-5)。
由于编码的偏移量只有16位有符号,因此我们以0xFFFB结尾
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.