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特有的,顺便说一句。 –