MIPS 汇编中跳转指令的第 4 位最高有效位

The 4 most significant bit in a jump instruction in MIPS Assembly

我了解到对于J格式指令,32位指令被拆分为6位操作码和26位目标地址。通过意识到最后 2 位将始终为 0,因为跳转只能跳转到字对齐地址,我们可以间接指定 32 位地址中的 28。

然后我们被告知,为了获得其他 4 位,MIPS 选择从 PC + 4 中取出第 4 个最高有效位。我的问题是如果 PC + 4 到目前为止 ahead/behind,这样它的4个最高有效位与我们预期目的地的4个最高有效位不同,这是否意味着我们无法到达我们的预期目的地?

does that mean that we're unable to reach our intended destination?

是的,您无法使用 J 类指令访问地址 space 的所有 32 位。实际上,使用 j 跳转的静态 linked 代码段的大小限制为 228结束或反之亦然。

如果你真的想到达地址 space 中的任何地方,你将需要一个跳转寄存器,jr(或 jalr)并在寄存器中有适当的地址,可以使用 lui/addi 对进行组装,或者从数据中加载,就像使用函数指针时的情况一样。对于 32 位机器,这些方法都可以到达地址 space.

中的任何位置

请注意,动态加载的库通常是每个单独的 linked 代码块,并且 DLL 间调用可以以某种方式使用 jr


此外,为了补充讨论,RISC V 在这方面做得更好,它消除了这种具有 16 个大代码段的方法;此外,他们还为 lui 添加了另一个对应项,即 auipc — 与 lui 具有相同的用法,但计算了一个 pc 相对值,该值可用于使代码更加独立于位置;而 jalr 指令已升级为具有立即数,因此可用于 2 指令序列 auipcjalr。此外,RISC V 工具链支持 linker relaxation,这是一种复杂的机制,允许 linker 在 link 时间缩短代码序列,而他们可以用更少的指令到达。