程序如何超过2 ^ 16字节?

时间:2013-10-18 01:07:05

标签: java c assembly memory-address

在汇编(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。那么,怎么可能呢?

4 个答案:

答案 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命令。