在汇编中转换3个地址代码

时间:2015-04-26 06:29:34

标签: assembly compiler-construction code-generation

我正在尝试在ASSEMBLY代码[代码生成]中转换3个地址代码。

考虑,

enter image description here

汇编代码序列为:

enter image description here

如果订单更改为t2 t3 t1 t4,则

enter image description here

  1. ADD使用内存操作数+寄存器操作数完成,但SUB永远不会使用内存操作数完成。同样,我已经看到MUL也从未用内存操作数完成。有这样的规则吗?

  2. 为什么使用MOV R0,t1?是否更好地再使用一个Register并继续使用R0

  3. 结束t1t2-t3-t1-t4是新序列,我们保存说明我们可以使用保留t1值的Reg立即在下一条指令中。但是要在立即指令后使用寄存器,我们必须将它存储在内存中?

1 个答案:

答案 0 :(得分:1)

通常,操作数必须包含至少一个寄存器,因此您不能直接从t2中减去t1。因此,您必须将op1移动到寄存器并将操作应用于op2 - 结果将进入寄存器。在这种情况下,e-t1 不能用作寄存器(它在操作数的错误一侧),而t1-e可以。

一种替代方法是否定并添加t1,然后可以在不诉诸记忆的情况下使用。所以:

mov   a, R0
add   b, R0           ; t1 (R0) := a+b
mov   c, R1
add   d, R1           ; t2 (R1) := c+d
neg   R1
add   e, R1           ; t3 (R1) := e+(-t2)
neg   R1
add   R0, R1          ; t4 (R1) := t1+(-t3)