繁体   English   中英

将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,$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM