编译原理之代码生成

编译原理之代码生成

ID:39356566

大小:1.45 MB

页数:64页

时间:2019-07-01

编译原理之代码生成_第1页
编译原理之代码生成_第2页
编译原理之代码生成_第3页
编译原理之代码生成_第4页
编译原理之代码生成_第5页
资源描述:

《编译原理之代码生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第八章代码生成湖南大学计算机与通信学院(软件学院)代码生成器的位置根据中间表示生成代码代码生成器之前可能有一个优化组件代码生成器的三个任务指令选择:选择适当的指令实现IR语句寄存器分配和指派:把哪个值放在哪个寄存器中指令排序:按照什么顺序安排指令执行主要内容代码生成器设计中的问题目标机模型静态/栈式数据区分配基本块相关的代码生成简单的代码生成算法窥孔优化8.1代码生成器设计中的问题设计目标:生成代码的正确性(最重要)易于实现、测试和维护输入输出指令选择寄存器分配计算顺序代码生成器设计中的问题输入前端生成的源代码的

2、IR(中间表示形式)及符号表信息中间表示形式的选择四元式、三元式、字节代码、堆栈机代码、后缀表示、抽象语法树、DAG图、…输出RISC、CISC;可重定向代码、汇编语言代码生成器设计中的问题指令选择代码生成器将中间表示形式映射为目标机代码映射的复杂性由下列因素决定:IR的层次高:用代码模板翻译,但代码质量不高,需优化低:利用低层次细节生成更高效的代码指令集体系结构本身的特性期望的目标代码质量代码生成器设计中的问题指令选择映射的复杂性由下列因素决定:IR的层次指令集体系结构本身的特性指令的统一性、完整性指令速度和机

3、器惯用语(idioms)期望的目标代码质量代码生成器设计中的问题指令选择映射的复杂性由下列因素决定:IR的层次指令集体系结构本身的特性期望的目标代码质量同一IR程序可用不同代码序列实现,它们的代价不同示例:a=a+1可实现为两种INCaLDR0,aADDR0,R0,#1STa,R08.2目标机模型本书使用三地址机器模型,指令如下:加载LDdst,addr;把地址addr中的内容加载到dst所指寄存器。addr:内存地址/寄存器保存STx,r;把寄存器r中的内容保存到x中。计算OPdst,src1,src2;把sr

4、c1和scr2中的值运算后将结果存放到dst中。无条件跳转BRL;控制流转向标号L的指令条件跳转Bcondr,L;对r中的值进行测试,如果为真则转向L。寻址模式变量x:指向分配x的内存位置a(r):地址是a的左值加上r中的值(可类比一维数组方便记忆)constant(r):寄存器中内容加上前面的常数即其地址;(可类比一维数组方便记忆)*r:寄存器r的内容为其地址*constant(r):r中内容加上常量的和所指地址中存放的值为其地址(可类比一维数组方便记忆)常量#constant56例子x=y-zLDR1,y//

5、R1=yLDR2,z//R2=xSUBR1,R1,R2//R1=R1-R2STx,R1//x=R1b=a[i]LRR1,i//R1=iMULR1,R1,8//R1=R1*8LDR2,a(R1)//R2=contents(a+contents(R1))STb,R2//b=R2程序及指令代价不同的目的有不同的度量最短编译时间、目标程序大小、运行时间、能耗不可判定一个目标程序是否最优指令代价=指令固定代价(设为1)+运算分量寻址模式代价,例:LDR0,R1;代价为1LDR0,M;代价是2LDR1,*100(R2);代价

6、为2常数和内存地址增加代价1,寄存器增加代价为0。8.3目标代码中的地址Q:如何将IR中的名字转换成目标代码中的地址?A:程序运行时环境划分为4个区域:代码区Code、静态区Static、栈区Stack和堆区Heap。不同区域中的名字采用不同寻址方式。如何为过程调用和返回生成代码静态分配栈式分配活动记录静态分配每个过程静态地分配一个数据区域,开始位置用staticArea表示callcallee的实现STcallee.staticArea,#here+20//保存返回地址BRcallee.codeArea...c

7、allee中的语句returnBR*callee.staticArea*为突出重点,经常将活动记录中其它的部分忽略。常量1字长实际为一个常量1字长常量1字长一个指令1字长一个指令1字长返回地址例子三地址代码action1callpaction2halt//p的代码action3return活动记录栈式分配寄存器SP指向栈顶第一个过程(main)初始化栈区过程调用指令序列ADDSP,SP,#caller.recordSize//增加栈指针,越过调用者自身的活动记录ST0(SP),#here+16//保存返回地址BR

8、callee.codeArea//转移到被调用者返回指令序列BR*0(SP)//被调用者最后执行,返回调用者SUPSP,SP,#caller.recordSize//调用者中减低栈指针34例:快速排序未完,转下页例:快速排序接上页名字的运行时刻地址在三地址语句中使用名字(实际上是按符号表条目提供的信息)来引用变量三地址语句x=0如果x分配在开始位置为static静态区域,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。