如何将基于堆栈的指令转换为基于寄存器的指令?

时间:2018-11-14 02:57:40

标签: compiler-construction mips

我的任务是从Compiler Design学业为C类语言生成mips指令。从计算机体系结构中可以了解到,mips是基于寄存器的指令集,可显式管理32个左右的通用寄存器。从词法分析到建立AST到生成真实代码的整个过程中,我发现很难想到基于寄存器的指令。当我目前遵循Python解释器的编译器部分的设计时,我发现其基于堆栈的字节码相当容易理解和实现。但是,我要学习的课程需要3地址中间代码,最后需要mips代码。

以下是我发现基于堆栈的代码很容易而基于寄存器的代码很容易的原因:

  • 基于堆栈的代码基本上只是压入操作数,将其弹出并计算并将结果压回。无需担心寄存器分配。
  • 基于堆栈的代码具有可以增长和收缩的堆栈,这与在基于寄存器的代码中可以使用的有限数量的寄存器不同。

这是我的问题:给定AST(非常类似于Python中的AST)和符号表,

  • 生成3地址中间代码,然后转换为mips代码
  • 生成基于堆栈的代码,然后转换为3地址代码,最后转换为mips代码。

任何一种工作方案都可以。

编辑:我真正想知道的是首先如何生成MIPS代码,而不是从其他形式进行转换

0 个答案:

没有答案