2012-09-10 56 views
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条)的大小,它如何在第一次通过期间使位置计数器保持最新?

+1

汇编器不必计算第一遍的偏移量。它可以解析代码,保留内部表格,并且通过这些表格多次尝试针对较短的指令进行优化。如果是全局的话,那么它可能会在附近放置一个数据字,并且链接器稍后会将其填入目的地。 –

+1

如果你没有这些资源并且不得不在飞行中生成说明,那么默认情况下你必须选择更长距离的解决方案,然后用nop补丁,如果你确实不需要达到那么远的话。 –

+0

这不是MIPS特有的,顺便说一句。 –

回答

1

有多种方法:

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

在你没有立即生成(半)最终的机器代码,也不需要重新扫描源代码和再组装起来,尽管它可能无论是哪种情况。您可以先生成“中间”代码或其代表,然后修复它,几乎链接器所做的事情。其中[链接]的

说到,这里还有另一种选择:

  • 离开这片的连接器来处理。这不是很难。现在,编译器(例如Microsoft Visual C++)可以进行链接时代码优化。