2012-09-10 79 views
1

考慮以下MIPS彙編(我使用MIPS因爲這是my Computer Organization and Design本書使用):兩通匯編程序如何處理由彙編程序擴展的指令?

beq $s0, $s1, L1 
add $t0, $t1, $t2 
... 
L1: ... 

因爲MIPS只使用16位在beq指令與PC相關的地址,如果L1足夠遠離beq,彙編器必須使用兩個指令(跳轉有地址26位)和一個新的標籤替換:

bne $s0, $s1, L2 
j  L1 
L2: add $t0, $t1, $t2 
... 
L1: ... 

如果連這是不夠的,它可能需要多個跳躍。

彙編程序不知道是否需要進行此替換,直到它知道L1的位置。由於它最初並不知道beq(1條指令或2條)的大小,它如何在第一次通過期間使位置計數器保持最新?

+1

彙編器不必計算第一遍的偏移量。它可以解析代碼,保留內部表格,並且通過這些表格多次嘗試針對較短的指令進行優化。如果是全局的話,那麼它可能會在附近放置一個數據字,並且鏈接器稍後會將其填入目的地。 –

+1

如果你沒有這些資源並且不得不在飛行中生成說明,那麼默認情況下你必須選擇更長距離的解決方案,然後用nop補丁,如果你確實不需要達到那麼遠的話。 –

+0

這不是MIPS特有的,順便說一句。 –

回答

1

有多種方法:

  • 預留空間只有一個指令,如果它的發現還不夠,展開它。
  • 爲兩條指令預留足夠的空間,然後用nop(s)填充未使用的空間或壓縮代碼。

在你沒有立即生成(半)最終的機器代碼,也不需要重新掃描源代碼和再組裝起來,儘管它可能無論是哪種情況。您可以先生成「中間」代碼或其代表,然後修復它,幾乎鏈接器所做的事情。其中[鏈接]的

說到,這裏還有另一種選擇:

  • 離開這片的連接器來處理。這不是很難。現在,編譯器(例如Microsoft Visual C++)可以進行鏈接時代碼優化。