在汇编(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 instructions代替。但它仍然限于26 bits
的地址,这意味着程序无法跨越256MB。那么,怎么可能呢?
答案 0 :(得分:2)
如MIPS Assembly/MIPS Details中所述,"有3种不同类型的指令:R指令,I指令和J指令。"最后一个跳转指令允许26位目标地址。请参阅J Instructions,了解如何推断出完整的32位地址。
附加:关于有效的32位地址,最低的两位总是为零,其他四位是从当前指令的地址借来的,所以我们不能让程序跨越256MB的边界。 "
答案 1 :(得分: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
答案 2 :(得分:0)
我不和mips合作,但只是想知道gcc可以放松我跳MIPS吗? PowerPC可以跳转到26位偏移,所以如果.text大小超过了这个限制,我需要gcc --relax选项再添加一个重定向......
答案 3 :(得分:0)
将目标地址加载到32位寄存器并使用JR
命令。