1

考虑以下 MIPS 程序集(我正在使用 MIPS,因为这是我的计算机组织和设计书使用的):

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 条指令)的大小,它如何在第一次通过时使位置计数器保持最新?

4

1 回答 1

1

有多种方法:

  • 只为一条指令保留空间,如果发现不够,请扩展它。
  • 为两条指令保留足够的空间,然后用nop(s) 填充未使用的空间或压缩代码。

在任何一种情况下,您都不必立即生成(半)最终机器代码,也不需要重新扫描源代码并重新组装它,尽管这是可能的。您可以首先生成“中间”代码或其表示,然后对其进行修复,这与链接器所做的差不多。

说到哪个[链接器],还有另一种选择:

  • 将此部分留给链接器处理。这不是很难。现在的编译器(例如 Microsoft Visual C++)可以进行链接时代码优化。
于 2012-09-10T21:29:40.380 回答