网站大量收购独家精品文档,联系QQ:2885784924

编译原理实用教程杨德芳电子教案 第11章 目标代码的生成.ppt

编译原理实用教程杨德芳电子教案 第11章 目标代码的生成.ppt

  1. 1、本文档共87页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 目标代码的生成 本章学习目标 代码生成工作一般在语法分析后或优化后的中间代码形式上进行,其功能是将这种中间代码的形式转换为某种结果代码的形式。本章主要内容有: 从各种中间代码生成目标代码 代码生成程序的自动构造技术 目标代码生成实例 11.1中间代码生成目标代码 代码生成工作一般在语法分析后的中间代码形式上进行,其功能是将这种中间代码形式转换成某种结果代码形式。常用的结果代码的格式有3种: (1)可以立即执行的机器语言代码,它们通常放在固定的存储区中,编译后可以直接执行。 (2)待装配的机器语言代码,为了这种形式的代码,必须经由连接装配程序将它们与另外一些运行子程序连接装配起来,组成可以执行的机器语言代码。 (3)汇编语言程序,必须通过汇编程序将其汇编成可以执行的机器语言代码。 在3种形式中,最容易生成的是汇编语言程序,它无须生成二进制形式代码,只要生成相应的符号化指令即可。 11.1.2从四元式生成代码 在四元式序列中,运算是按照执行顺序排列的,只要顺次扫描四元式,就能逐个生成代码。由于所有的运算都要在累加器中进行,所以,在生成一条代码前,需要知道累加器的内容。为此,引进全局量ACC,它是编译时刻的变量,用以指明运行时刻累加器的状态。ACC为空,则表示运行时累加器为空。若ACC不空,则表示累加器中有变量名和临时变量的值。 过程INACC有两个参数,功能为:在生成可交换的双边运算(如*,+)指令之前,调用该过程。将其中一个参数放到累加器。对于不可交换的指令(如÷或-),要求将第一个运算量对象放到累加器中。例如,在生成A/B时,先调用INACC(A,′ ′),它生成把A存入累加器的指令。无论在哪种情况下,若累加器当前不为空,则INACC先生成一条保留累加器内容的指令。过程INACC如下: procedure INACC(A,B) string A,B; begin string T; if ACC=′′then begin GEN(′LD′,A); ACC:=A; return end; if ACC=B then begin T:=A;A:=B;B:=A end else if ACC ≠A then begin GEN(′ST′,ACC); GEN(′LD′,A); ACC:=A; end; end; 这里采用的方法是顺序扫描四元式,并逐个生成每个四元式的代码。假定用计数器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).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*((A*B+C)-C*D)可以生成如表11-2所示的结果代码。 11.1.3从三元式生成代码 从三元式生成代码需要引进和删除一些临时变量,例如,从三元式3)* X Y 生成代码时,就需要引进代表结果值的临时变量。而且对于最后一个引进三元式(3)的那个三元式,当生成的代码后,代表(3)的结果值的临时变量就不再需要了,应将其删去。假设临时变量的范围是两两不相交或嵌套的,那么,就能使用一个编译时刻栈去保存和删除这些临时变量。否则,管理就会比较复杂,在这里假设每个临时变量仅需要引用一次。 在生成三元式i的代码之前,必须检查两个运算量。如果其中一个运算量引用了前面的三元式,那么就必须用分配给该三元式存放结果值的临时变量名去代替这个运算的对象。这项工作由过程GETTEMP(A,B)来完成。其中A是被检查的运算对象字段,在返回时,B中包含临时变量名或变量名。该过程的编写如下: procedure GETTEMP(

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档