【问题标题】:Convert 3 Address codes in Assembly在汇编中转换 3 个地址代码
【发布时间】:2015-04-26 06:29:34
【问题描述】:

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

考虑一下,

汇编代码序列为:

如果顺序改为t2 t3 t1 t4,那么

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

  2. 为什么使用MOV R0,t1?多使用一个注册并继续使用R0不是更好吗?

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

【问题讨论】:

  • 汇编代码取决于您编写代码的架构。 通常使用寄存器,因为对特定内存位置进行读/写操作更耗时.

标签: assembly compiler-construction code-generation


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多