在汇编中转换 3 个地址代码
Convert 3 Address codes in Assembly
我正在尝试在汇编代码 [代码生成] 中转换 3 个地址代码。
考虑一下,
汇编代码序列为:
如果订单改为t2 t3 t1 t4,则
ADD
是用内存操作数 + 寄存器操作数完成的,但 SUB
永远不会用内存操作数完成。同样,我已经看到 MUL
也从未使用 Memory 操作数完成。有这样的规则吗?
为什么要用MOV R0,t1
?多用一个Register,一直用R0
不是更好吗?
把t1
拉下来,t2-t3-t1-t4
是新的序列,我们保存指令即我们可以使用保留t1
的值立即在下一条指令中。但是要在立即指令之后使用寄存器,我们必须将它存储在内存中吗?
通常,操作数必须涉及至少一个寄存器,因此您不能,例如,直接从 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)
我正在尝试在汇编代码 [代码生成] 中转换 3 个地址代码。
考虑一下,
汇编代码序列为:
如果订单改为t2 t3 t1 t4,则
ADD
是用内存操作数 + 寄存器操作数完成的,但SUB
永远不会用内存操作数完成。同样,我已经看到MUL
也从未使用 Memory 操作数完成。有这样的规则吗?为什么要用
MOV R0,t1
?多用一个Register,一直用R0
不是更好吗?把
t1
拉下来,t2-t3-t1-t4
是新的序列,我们保存指令即我们可以使用保留t1
的值立即在下一条指令中。但是要在立即指令之后使用寄存器,我们必须将它存储在内存中吗?
通常,操作数必须涉及至少一个寄存器,因此您不能,例如,直接从 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)