我想知道如何计算跳转指令的机器编码。
让我说我有
j foo
地址0x00400000
现在,如果foo位于地址0x0040002c,该怎么办?然后,我如何找到跳转指令的机器编码?
[0x00400000] j foo
...
[0x0040002c] foo:
在Youtube上找到一些指南,说它会像是一样的
((400000 + 4) - 40002c)/ 4
但是跳转有操作码2,我没有得到这个计算。
谢谢
答案 0 :(得分:2)
J
具有操作码2,编码为:
---------------------------
| opcode | target |
---------------------------
6 bits 26 bits
因此,指令词应为(2 << 26) | target
现在,J
和JAL
不是PC相关的,而是PC区域相对的。也就是说,target
是从当前正在执行的256MB区域的开头到目标地址到目标地址的距离。0x00400000所在的256MB区域从0x00000000开始。因此,target
将被编码为(0x0040002c - 0x00000000) >> 2
== 0x0010000B
。这会为您提供说明字(2 << 26) | 0x0010000B
== 0x0810000B