考虑以下MIPS程序集(我正在使用MIPS,因为这是my Computer Organization and Design本书使用的内容:
beq $s0, $s1, L1
add $t0, $t1, $t2
...
L1: ...
因为MIPS仅在beq
指令中使用16位作为PC相对地址,如果L1
离beq
足够远,汇编器必须用两条指令替换它(跳转有26位地址)和一个新标签:
bne $s0, $s1, L2
j L1
L2: add $t0, $t1, $t2
...
L1: ...
即使这还不够,也可能需要多次跳转。
汇编程序在知道L1
的位置之前不知道是否需要进行此替换。由于它最初不知道beq
(1条指令或2条)的大小,如何在第一次通过期间使位置计数器保持最新状态?
答案 0 :(得分:1)
有多种方法:
nop
(s)填充未使用的空格或压缩代码。在任何一种情况下,您都不必立即生成(半)最终机器代码,也不需要重新扫描源代码并重新组装它,尽管它是可能的。您可以先生成“中间”代码或其表示,然后再修复它,就像链接器所做的那样。
说到[链接器],还有另一种选择: