0

在汇编 (MIPS) 中,立即指令具有以下格式:

+----------+------+------+-------+
|  opcode  |  rs  |  rt  |  IMM  |
+----------+------+------+-------+

在哪里,

Opcode = 6 bits
Source register (rs) = 5 bits
Destination register (rt) = 5 bits
Immediate value (IMM) = 16 bits

也就是说,您可以跳转到2^16 bytes = 64 kb远离当前指令的另一条代码指令(分支指令)。程序(C、Java 等)怎么可能超过 2^16 字节的代码?

编辑:

正如@trashgod 指出的那样,编译器可以改用J 指令。但它仍然限于26 bits地址,这意味着程序不能跨越 256MB。那么,怎么可能呢?

4

4 回答 4

2

我不是 MIPS 专家,但是相对跳转的最大偏移量与程序本身的大小无关。

跳转可以由编译器序列化,也可以在汇编代码中手动序列化。这样,一个人可以毫无问题地向上或向下跳跃任何距离。

;it is pseudo code, not mips
start:
        jmp  to_the_limit
        .....
        .... 256MB bloated code
        ....
to_the_limit:
        jmp  even_further
        ....
        .... another 256MB of even more bloated code.
        ....
even_further:
        jmp  this_code
于 2013-10-18T06:36:39.177 回答
2

MIPS Assembly/MIPS Details中所述,“有 3 种不同类型的指令:R 指令、I 指令和 J 指令。” 最后,跳转指令,允许 26 位目标地址。请参阅J 指令,了解如何推断完整的 32 位地址。

补充:关于一个有效的 32 位地址,最低两位始终为零,其他四位是“从当前指令的地址借来的,所以我们不能让程序跨越 256MB 的边界”。

于 2013-10-18T01:17:47.763 回答
0

我不使用 mips,但只是想知道 gcc 可以放松我为 MIPS 跳吗?PowerPC 可以跳转到 26 位偏移量,因此如果 .text 大小超过该限制,我需要 gcc --relax 选项来添加更多重定向...

于 2013-10-18T01:51:18.373 回答
0

将目标地址加载到 32 位寄存器中并使用JR命令。

于 2013-10-18T16:51:32.057 回答