2012-04-28 210 views
1

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

+2

3地址代码?你能澄清吗? (我已经删除了关于你的问题的编译器优化标记,考虑到它还没有完全正常工作,我假设你没有优化。) – Corbin 2012-04-28 09:28:16

+1

开始寻找一个3地址指令的翻译,比如说'add' 。你可以在MIPS指令列表中找到一个等价物吗?也许是近似的等值? – 2012-04-28 09:48:03

+0

@user - 您必须查看每个3地址指令,并弄清楚如何在汇编中执行此操作。然后产生一个或多个汇编指令。 – 2012-04-28 09:57:47

回答

3

如前所述,这是一个直接翻译。没有什么可以澄清的。作为一个例子,下面三个地址代码:

 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: 

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