【问题标题】:How to convert a three address code to MIPS Assembly language?如何将三地址代码转换为 MIPS 汇编语言?
【发布时间】:2012-04-28 09:26:01
【问题描述】:

我正在做一个项目,我必须在其中创建一个可以为 C 代码生成 MIPS 汇编代码的转换器。正在使用的编程语言是 C++,我已经完成了三个地址代码的生成,并且对如何进一步进行感到非常困惑。

【问题讨论】:

  • 3 地址码?你能澄清一下吗? (并且我已经删除了您问题上的编译器优化标签。考虑到它尚未完全正常工作,我假设您没有进行优化。)
  • 从寻找一个 3 地址指令的翻译开始,比如add。你能在 MIPS 指令列表中找到对应的指令吗?也许是一个近似的等价物?
  • @user - 您必须查看每条 3 地址指令并弄清楚您将如何在汇编中执行此操作。然后生成一个或多个组装说明。
  • 是的,即使我正在考虑一次执行一条指令,但我并没有清楚地了解它和编译器优化,以从中间代码(三地址代码)生成汇编代码你需要先优化它。

标签: c++ assembly compiler-construction mips


【解决方案1】:

如前所述,这是直接翻译。真的没有什么需要澄清的。以下面的三地址码为例:

      i := 0                  ; assignment
L1:   if i >= 10 goto L2      ; conditional jump
      t0 := i*i
      t1 := &b                ; address-of operation
      t2 := t1 + i            ; t2 holds the address of b[i]
      *t2 := t0               ; store through pointer
      i := i + 1
      goto L1
L2:

MIPS 翻译为:

        li $t0, 0             #allocator assigned i to t0
L1:     bge $t0, 10, L2    
        mult $t1, $t0, $t0  
        la $t2, b             
        add $t3, $t2, $t0   
        sw $t1, ($t3)       
        addi $t0, $t0, 1
        j L1
L2:

如果你有幸拥有这样的三个地址,你几乎不需要做任何事情。找到相应的操作码以配合指令。寄存器分配已经完成。如果三地址代码实际上是一堆字符串,我会考虑编写一个小型解析器(使用生成器)而不是尝试从字符串中提取信息。

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 2013-11-21
    • 2014-08-16
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2021-08-22
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多