Compilation 汇编代码生成是如何工作的?

Compilation 汇编代码生成是如何工作的?,compilation,compiler-construction,code-generation,Compilation,Compiler Construction,Code Generation,我最近一直在研究编译器设计。我已经很好地掌握了解析阶段,但是在理解代码生成的工作原理时遇到了一些困难 据我所知,代码生成阶段似乎有3个主要步骤: 指令选择(贪婪平铺) 指令调度 寄存器分配 现在,指令调度有点超出了我目前正在尝试的范围,我认为通过更多的研究和原型设计,我可能会将注意力集中在寄存器分配的图着色算法上 让我感到困惑的是第一步,教学选择。从我所读到的内容来看,目标机器语言中的每条指令都由一个平铺表示;目标是找到与树的最大部分匹配的指令(因此昵称为贪婪平铺) 我感到困惑的是,当指令实

我最近一直在研究编译器设计。我已经很好地掌握了解析阶段,但是在理解代码生成的工作原理时遇到了一些困难

据我所知,代码生成阶段似乎有3个主要步骤:

  • 指令选择(贪婪平铺)
  • 指令调度
  • 寄存器分配
现在,指令调度有点超出了我目前正在尝试的范围,我认为通过更多的研究和原型设计,我可能会将注意力集中在寄存器分配的图着色算法上

让我感到困惑的是第一步,教学选择。从我所读到的内容来看,目标机器语言中的每条指令都由一个平铺表示;目标是找到与树的最大部分匹配的指令(因此昵称为贪婪平铺)

我感到困惑的是,当指令实际上与语法树不是1:1对应时,如何选择指令

例如,基于累加器的体系结构,如Z80或MIPs单指令体系结构。在Z80上执行甚至16位整数运算可能需要使用累加器或阴影寄存器

还有一些指令只能在某些寄存器上使用,尽管它们是通用的

我的假设是否正确

a) 平铺可以由与语法树模式匹配的指令序列组成,而不仅仅是1:1匹配

b) 代码生成器首先为基于堆栈的体系结构(或具有无限临时寄存器的体系结构)生成代码,并在寄存器分配阶段以某种方式扩展和替换指令。

a)磁贴可以发出任意数量的指令。例如,如果您有类似
%x的指令
mov %x, %y
add %x, %z