汇编代码生成是如何工作的? [英] How Does Assembly Code Generation Work?

查看:23
本文介绍了汇编代码生成是如何工作的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

  • 指令选择(贪婪平铺)
  • 指令调度
  • 寄存器分配

现在,指令调度有点超出了我目前正在尝试做的事情,我认为通过更多的研究和原型设计,我可能会考虑用于寄存器分配的图着色算法。

难住我的是第一步,指令选择。根据我所读到的内容,目标机器语言中的每条指令都由一块块表示;目标是找到与树的最大部分匹配的指令(因此有了贪婪块的昵称)。

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

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

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

我的假设正确吗?

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

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

推荐答案

a)磁贴可以发出任意数量的指令。例如,如果您有类似%x <- %y + %z的指令,但目标计算机只有两个地址的指令,则匹配的切片可能会发出汇编序列(目标是第一个操作数)

mov %x, %y
add %x, %z
B)允许哪种类型的寄存器(或常量或内存引用)作为指令的操作数由指令本身确定,因此指令选择阶段必须使用符号寄存器名称(伪寄存器)进行表示。寄存器分配阶段确实可能发出添加指令,例如,当所需类的寄存器不可用于分配时,溢出/加载代码。

检查这个 Survey on Instruction Selection: an Extensive and Modern Literature Review

这篇关于汇编代码生成是如何工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆