资源描述:
《目标代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、目标代码生成概况1.目标代码生成程序功能:生成目标程序。输入是源程序的中间表示。前提:无词法错误、无语法错误,且经历了语义分析(类型检查与若干静态语义检查)输出是目标代码。2.目标代码生成中的有关问题(1)目标机目标语言的确定(2)语言结构目标代码的确定(3)运行时刻存储管理(4)寄存器分配(5)求值顺序的选择(6)代码生成程序的设计(1)目标机目标语言的确定1)目标机器代码形式又可以是绝对地址形式或目标模块结构形式。2)汇编语言程序形式3)虚拟机目标代码形式(2)语言结构目标代码的确定目标代码生成的关键要点:确定语言结构与目标代码的对应关系。对源语言中各类语言结构
2、,依据语义确定相应的目标代码结构,通过确定源语言与目标语言之间的对应关系,保证正确实现语义。显然,能否建立这样的对应关系直接影响到编译程序的成败。(3)运行时刻存储管理当前的计算机都是冯.诺伊曼型的,其特征是变量—存储字,也就是用变量来访问存储字,变量名实际上是存储字的名字。为了存储分配的正确实现,除了考虑标识符的作用域问题外,还必须考虑字边界对齐问题,即对于字节编址的计算机,必须注意对于不同类型的量所分配存储区域的起始编址都必须符合边界要求。为简单起见,不讨论字边界对齐问题(4)寄存器分配寄存器用于存放中间结果,运算速度快,但个数有限。对于寄存器的使用,应该考虑在
3、程序运行到某处时将有哪些变量占用哪些寄存器。要选择最优的寄存器分配方案是困难的,还可能因为目标机的硬件和/或操作系统可能要求寄存器的使用遵守一些约定而使问题进一步复杂化。合理、充分地使用寄存器,是编译实现中的一个重要方面,但为简单起见,不考虑寄存器使用的约定等。寄存器的个数对目标代码的生成有很大影响,但也往往假定有无限个。(5)求值顺序的选择改变求值顺序,使得保存中间运算结果的寄存器的个数较少。例如,C语言表达式(j++)*(j++)*(j++)的求值C语言函数调用中参数的计算顺序将不讨论求值顺序问题。一般情况下,简单地就按源程序书写顺序或内部中间表示生成的顺序生成
4、目标代码。(6)代码生成程序的设计最重要的是产生正确的代码,此外,易于实现、测试和维护是代码生成程序的重要设计目标。目标代码虚拟目标代码:虚拟机上的目标程序。在本地机器上具备虚拟机的解释器。实际目标代码:实际机器上的指令序列绝对地址机器代码:可重定位的机器代码:汇编代码:三种硬件地址模式指令格式:OpR#C(立即-----寄存器)OpR2d(R1)(存储器-----寄存器)OpR1R2(寄存器-----寄存器)几个常见指令的含义:LDRSource从Source读出送入ROpRSourceSourceopR结果送入RSTTargetRR的内容送入Target.表达式
5、和赋值语句的翻译形如(Op,A,B,T):LDRA;OpRB形如(ASSIG,A,B):LDRA;STBR例:Z:=X*(a+b)*Y*(a+b)(+,a,b,t1)LDRa;AddRb(*,X,t1,t2)STRt1;MultRX(*,t2,Y,t3)MultRY(*,t3,t1,t4)MultRt1输入/输出语句的翻译输入语句:(READ,A)INRSTA,R输出语句:(WRITE,A)LDR,AOUTR条件语句四元式的翻译(THEN,t,_,_)生成的目标代码为:LDR,tJUMP0R,__(ELSE,_,_,_)生成的目标代码为:JMP__同时回填JUMP0
6、指令的目的地址(ENDIF,_,_,_)不产生目标代码,只负责完成ELSE子句的地址回填工作。循环语句的翻译(WHILE,_,_,_)不产生目标代码,只用来标记while语句的入口地址。(DO,t,_,_)产生的目标代码为:LDR,tJUMP0R,_(ENDWHILE,_,_,_)产生的目标代码:JMPA回填前面DO四元式所产生的半条指令标号和goto语句的翻译(LABEL,_,_,L)不产生目标代码,只向L所分配到的存储单元写入转向地址。(GOTO,_,_,L)生成的目标代码为JMP*L过程、函数说明的翻译(ENTRY,Q,—,—)不产生目标代码,只需将当前指令地
7、址A填入Q的相应语义信息中。(ENDPROC,—,—,—)或(ENDFUNC,—,—,—)1.将本层活动记录中保存的机器状态恢复过来,对应一组读指令。2.删除本层活动记录,使动态外层的活动记录成为当前活动记录;3.按1(top)中记载的返回地址返回。目标代码为:STtop,spLDsp,0(top)//作废当前活动记录JMP1(top)//按返回地址返回过程、函数调用语句的翻译值参情形(ValACT,t,Offset,size)a.若t为间接变量,则生成的目标代码为:LDR,*tSToffset(sp),Rb.若t为直接变量,则生成的目标代码为:LDR,tSTo