MIPS计算跳转指令的机器编码

MIPS Calculate machine encoding of a jump instruction

我想知道如何计算跳转指令的机器编码。

假设我有
j foo
在地址 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
现在,JJAL 不是 PC 相关的,而是 PC 区域相关的。也就是说,target是从你当前正在执行的256MB区域开始到目标地址的距离in words。0x00400000所在的256MB区域从 0x00000000 开始。所以 target 将被编码为 (0x0040002c - 0x00000000) >> 2 == 0x0010000B。这给你指令词 (2 << 26) | 0x0010000B == 0x0810000B