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條)的大小,它如何在第一次通過期間使位置計數器保持最新?
彙編器不必計算第一遍的偏移量。它可以解析代碼,保留內部表格,並且通過這些表格多次嘗試針對較短的指令進行優化。如果是全局的話,那麼它可能會在附近放置一個數據字,並且鏈接器稍後會將其填入目的地。 –
如果你沒有這些資源並且不得不在飛行中生成說明,那麼默認情況下你必須選擇更長距離的解決方案,然後用nop補丁,如果你確實不需要達到那麼遠的話。 –
這不是MIPS特有的,順便說一句。 –