欢迎来到天天文库
浏览记录
ID:40336233
大小:982.00 KB
页数:88页
时间:2019-07-31
《编译原理实用教程 杨德芳 第11章 目标代码的生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第11章目标代码的生成本章学习目标代码生成工作一般在语法分析后或优化后的中间代码形式上进行,其功能是将这种中间代码的形式转换为某种结果代码的形式。本章主要内容有:从各种中间代码生成目标代码代码生成程序的自动构造技术目标代码生成实例11.1中间代码生成目标代码代码生成工作一般在语法分析后的中间代码形式上进行,其功能是将这种中间代码形式转换成某种结果代码形式。常用的结果代码的格式有3种:(1)可以立即执行的机器语言代码,它们通常放在固定的存储区中,编译后可以直接执行。(2)待装配的机器语言代码,为了这种形式的代码,必须经由连接装配程序
2、将它们与另外一些运行子程序连接装配起来,组成可以执行的机器语言代码。(3)汇编语言程序,必须通过汇编程序将其汇编成可以执行的机器语言代码。在3种形式中,最容易生成的是汇编语言程序,它无须生成二进制形式代码,只要生成相应的符号化指令即可。指令含义LDm把单元m的内容送入累加器STm把累加器的内容存入单元mADDm把单元m的内容加到累加器SUBm从累加器中减去单元m的内容MULTm用单元m的内容乘累加器的内容DIVm用累加器的内容除以单元m的内容ABS将累加器的负号变为正号CHS改变累加器的内容表11-1假想的计算机中的符号指令11.
3、1.2从四元式生成代码在四元式序列中,运算是按照执行顺序排列的,只要顺次扫描四元式,就能逐个生成代码。由于所有的运算都要在累加器中进行,所以,在生成一条代码前,需要知道累加器的内容。为此,引进全局量ACC,它是编译时刻的变量,用以指明运行时刻累加器的状态。ACC为空,则表示运行时累加器为空。若ACC不空,则表示累加器中有变量名和临时变量的值。过程INACC有两个参数,功能为:在生成可交换的双边运算(如*,+)指令之前,调用该过程。将其中一个参数放到累加器。对于不可交换的指令(如÷或-),要求将第一个运算量对象放到累加器中。例如,在
4、生成A/B时,先调用INACC(A,′′),它生成把A存入累加器的指令。无论在哪种情况下,若累加器当前不为空,则INACC先生成一条保留累加器内容的指令。过程INACC如下:procedureINACC(A,B)stringA,B;beginstringT;ifACC=′′thenbeginGEN(′LD′,A);ACC:=A;returnend;ifACC=BthenbeginT:=A;A:=B;B:=AendelseifACC≠AthenbeginGEN(′ST′,ACC);GEN(′LD′,A);ACC:=A;end;end
5、;这里采用的方法是顺序扫描四元式,并逐个生成每个四元式的代码。假定用计数器i控制顺序,并假定第i个四元式的4个字段分别为(guad(i).OP,guad(i).oper1,guad(i).oper2和guad(i).RESULT表示,即(运算符,第一操作数,第二操作数,运算结果),以下是四元式的代码生成程序,即对:+,-,*,/和单目减中的每个运算分别给出相应代码时,所要调用的代码生成程序。(1)加法(乘法)四元式的代码生成程序。INACC(guad(i).OPER1,guad(i).OPER2);GEN(′ADD′,guad(i
6、).OPER2);或:[GEN(′MULT′,guad(i).OPER2);]ACC:=guad(i).RESULT;(2)减法(除法)四元式的代码生成程序。INACC(guad(i).OPER1,′′)GEN(′SUB′,guad(i).OPER2);[GEN(′DIV′,guad(i).OPER2);]ACC:=guad(i).RESULT;(3)单目减四元式的代码生成程序(3)。INACC(guad(i).OPER1,′′)GEN(′CHS′,′′);ACC:=guad(i).RESULT;应用这些代码生成程序,表达式A*(
7、(A*B+C)-C*D)可以生成如表11-2所示的结果代码。四元式目标代码累加器ACC*ABT1LDAMULTBT1+T1CT2ADDCT2*CDT3STT2LDCMULTDT3—T2T3T4STT3LDT2SUBT3T4*AT4T5MULTAT5表11-2表达式生成的目标代码11.1.3从三元式生成代码从三元式生成代码需要引进和删除一些临时变量,例如,从三元式3)*XY生成代码时,就需要引进代表结果值的临时变量。而且对于最后一个引进三元式(3)的那个三元式,当生成的代码后,代表(3)的结果值的临时变量就不再需要了,应将其删去。假
8、设临时变量的范围是两两不相交或嵌套的,那么,就能使用一个编译时刻栈去保存和删除这些临时变量。否则,管理就会比较复杂,在这里假设每个临时变量仅需要引用一次。12……T1T2TiitopTRIPTEMP图11-1桟结构调整在生成三元式i的代码之前,必须
此文档下载收益归作者所有