双程汇编程序如何处理汇编程序扩展的指令?

时间:2012-09-10 00:11:19

标签: assembly mips relative-addressing

考虑以下MIPS程序集(我正在使用MIPS,因为这是my Computer Organization and Design本书使用的内容:

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

因为MIPS仅在beq指令中使用16位作为PC相对地址,如果L1beq足够远,汇编器必须用两条指令替换它(跳转有26位地址)和一个新标签:

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

即使这还不够,也可能需要多次跳转。

汇编程序在知道L1的位置之前不知道是否需要进行此替换。由于它最初不知道beq(1条指令或2条)的大小,如何在第一次通过期间使位置计数器保持最新状态?

1 个答案:

答案 0 :(得分:1)

有多种方法:

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

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

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

  • 留下此片段供链接器处理。这不是很难。现在,编译器(例如Microsoft Visual C ++)可以进行链接时代码优化。