<分区>
我想知道如何计算跳转指令的机器编码。
假设我有
杰富
在地址 0x00400000
现在,如果 foo 位于地址 0x0040002c 会怎样。那么如何找到跳转指令的机器编码呢?
[0x00400000] j foo
...
[0x0040002c] foo:
在 Youtube 上找到一些指南说它会像
((400000+4) - 40002c)/4
但是 jump 有操作码 2,我没有通过那个计算得到它。
谢谢
<分区>
我想知道如何计算跳转指令的机器编码。
假设我有
杰富
在地址 0x00400000
现在,如果 foo 位于地址 0x0040002c 会怎样。那么如何找到跳转指令的机器编码呢?
[0x00400000] j foo
...
[0x0040002c] foo:
在 Youtube 上找到一些指南说它会像
((400000+4) - 40002c)/4
但是 jump 有操作码 2,我没有通过那个计算得到它。
谢谢
最佳答案
J
有操作码 2,编码为:
---------------------------
| opcode | target |
---------------------------
6 bits 26 bits
因此,指令字应该是(2 << 26) | target
.
现在,J
和 JAL
不是 PC 相关的,而是 PC 区域相关的。即 target
是从您当前正在执行的 256MB 区域的开头到目标地址的距离in words。0x00400000 所在的 256MB 区域从 0x00000000 开始。所以target
将被编码为 (0x0040002c - 0x00000000) >> 2
== 0x0010000B
.这给了你指令词 (2 << 26) | 0x0010000B
== 0x0810000B
关于assembly - MIPS计算跳转指令的机器编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39510183/