2013-10-18 52 views
0

在大會(MIPS),立即指令具有以下格式:程序如何超過2^16字節?

+----------+------+------+-------+ 
| 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。那麼,它怎麼可能?

+1

在Java情況下:JVM。 JVM負責處理它,這是唯一相關的問題:C如何做到這一點?或者一般如何實現(回到理解MIPS)? – pedrofurla

+0

另請參閱此[Q&A](http://stackoverflow.com/q/7877407/230513)。 – trashgod

回答

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

MIPS Assembly/MIPS Details所述,「有3種不同類型的指令:R指令,I指令和J指令。」最後的跳轉指令允許一個26位的目標地址。關於如何推斷完整的32位地址,請參見J Instructions

Addedum:關於一個有效的32位地址,最低兩位始終爲零,其他四位「從當前指令的地址借用,所以我們不能讓一個程序跨越256MB的邊界。

+0

我明白了。所以,你告訴最大是2^26的代碼。我知道這已經夠用了,但是有可能超過2^26的程序嗎?對於複合體應用,它可能是可能的。 – Doon

+0

是的;最低兩位始終爲零,其他四位「從當前指令的地址借用」。 – trashgod

+0

你可以給j一個32位跳轉的寄存器。 – BevynQ

0

我不使用mips,但只是想知道gcc可以放鬆我爲MIPS跳? PowerPC可以跳到26位偏移量,所以如果.text大小超過了這個限制,我需要gcc --relax選項來添加一個更多的重定向...

0

將目標地址加載到32位寄存器中並使用JR命令。

相關問題