您好,欢迎访问三七文档
实验八目标程序生成【实验目的】•了解目标代码生成阶段在编译处理过程中的功能和作用•了解常用的三种目标代码形式及其优缺点•了解虚拟机及其指令系统•深入理解并掌握有中间代码向目标代码转换的过程和原理【实验学时】4学时【实验要求】•熟练掌握虚拟机的指令系统•理解并掌握指令选择的方法•理解多寄存器分配的原则和方法•熟练掌握基本语句从四元式中间代码形式到目标代码的翻译原理和方法•独立完成目标代码生成程序【实验原理】一、四元式到目标代码的转换分析1.取ARG结构值对应的目标代码四元式中间代码的操作分量和目标量以ARG结构给出,在生成目标代码的过程中,首先要根据ARG结构取得对应的值或者地址,存入累加寄存器ac中,再生成运算的目标代码。从ARG结构取值的过程如下表所示:ARG结构种类取值对应的目标代码常量cLDC,ac,c,0标号labLDC,ac,lab,0源变量或临时变量v直接变量取v的绝对地址到ac;(表-2)LD,ac,0,ac间接变量取v的绝对地址到ac;(表-2)LD,ac1,0,acLD,ac,0,ac12.取变量的绝对地址对应的目标代码如下表所示:变量种类取绝对地址对应的目标代码源变量vLDA,ac,level,displayoffADD,ac,ac,spLDC,ac1,off,0ADD,ac,ac,ac1注:level为变量v所在的层数,off为变量v的偏移。临时变量tLDC,ac1,off,0ADD,ac,sp,ac1注:off为临时变量t的偏移量二、关键问题的处理1.标号和跳转的处理:处理标号和跳转,需要用到标号地址表;表的结构为:中间代码标号目标代码地址下一项Labeldestnumnext(1)遇到标号定位时:设标号为L,应转向的目标代码为p1,分为两种情况:在标号地址表中没有L项,则填写表项(L,p1,NULL),并链入表尾;在标号地址表中有L项(L,addr,Next),则根据当前pc,回填addr对应的目标代码。(2)遇到跳转代码时:设要跳到的标号为L,这条语句对应的目标地址为p2,分为两种情况:在标号地址表中没有L项,则构造一个表项(L,p2,NULL),链入表尾;在标号地址表中有L项(L,p1,next),则从中取出L的代码地址p1,直接生成目标代码。2.形实参结合的处理:(1)形参为值参:实参是常数值:将常数值送入相应存储单元;实参是直接变量:找到变量的存储地址,取值,送相应存储单元;实参是间接变量:此时变量的存储单元存放的是地址。找到变量的存储地址,取内容作为地址,再取内容,得到实参值,送相应存储单元;取ARG结构值对应的目标代码示意表取变量的绝对地址对应的目标代码示意表(2)形参为变参:这时实参必须是变量,长度为1。实参是直接变量:应将实参变量的地址送入形参单元;找到变量的存储地址,送相应存储单元;实参是间接变量:要送实参变量单元的内容;找到变量的存储地址,取内容,送相应存储单元。3.过程调用的工作分配:由于过程调用中的有些工作是相同的,如果都放在调用语句处处理,当一个过程被多个过程调用时,就要重复很多目标代码。从语法树生成目标代码时,所有过程调用的处理工作都必须放在调用语句处进行处理。而从中间代码生成目标代码时,由于有过程入口和过程出口中间代码的存在,我们就可以把有些工作安排在子程序的入口和出口处完成。这样,过程调用中的整个工作(除过程体的执行部分)可分配到过程调用处,过程入口处和过程出口处。这样就可以节省一些目标代码。具体分配如下:过程调用代码完成:保存旧的display表的偏移量;设置新的display表的偏移;保存返回地址;转向过程入口。过程入口处完成:保存sp值;保存层数;保存累加寄存器的内容,ac,ac1,ac2构造NewAR的Display表;修改sp和top值:sp:=top;top:=top+NewAR.Size过程出口处完成:恢复寄存器的内容;恢复sp和top的值:top:=sp;sp:=CurrentAR.sp;取出返回地址,返回。【实验步骤】1.熟悉虚拟机TM的指令系统2.根据中间代码指令和目标代码指令间的对应关系,将实验七中生成的中间代码程序映射为目标代码程序3.进行指令选择优化4.进行寄存器分配优化5.生成虚拟机上可运行的高效目标代码程序
本文标题:目标程序生成
链接地址:https://www.777doc.com/doc-642846 .html