第十二章代码生成..pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第12章 代码生成 代码生成: 中间代码作为输入 特定机器的机器 语言或汇 编语言作为输出, 这样的转换程序称为代码生成器, 计算待用信息的算法: 例: * * 如果用‘op’表示运算符,用‘M’表示内存单元,用变量名表示该变量所在的单元,‘C’表示常量,‘*’表示间址方式存取,指令形式表(P278 表12.2)。 op Ri,M op Ri,Rj op Ri,c(Rj) op Ri,*M op Ri,*Rj op Ri,*c(Rj) (Ri)op(M) ?? Ri (Ri)op(Rj) ?? Ri (Ri)op((Rj)+c) ?? Ri (Ri)op((M)) ?? Ri (Ri)op((Rj)) ?? Ri (Ri)op(((Rj)+c)) ?? Ri 指令 意义 指令 意义 LD Ri, B ST Ri, B J X CMP A,B 把B单元的内容取到寄存器 Ri,即(B) ?? Ri。 把寄存器Ri的内容存到B单元,即(Ri) ?? B。 无条件转向X单元。 把A单元和B单元的值进行比较,并根据比较情况把机器内部特征寄存器CT置成相应状态。CT占两个二进位。根据AB或A=B或AB分别置CT为0或1或2。 JX J≤X J=X J≠X JX J≥X 如CT=0转X单元。 如CT=0或CT=1转X单元。 如CT=1转X单元。 如CT≠1转X单元。 如CT=2转X单元。 如CT=2或CT=1转X单元。 一个简单的代码生成器   它以四元式的代码作为输入,将其转换成目标代码。它在基本块内如何充分利用寄存器提高目标代码的运行效率? 寄存器分配的原则(P276) ① 当生成某变量的目标代码时,尽量让变量的值或计算结果保留在寄存器中 直到寄存器不够分配时为止,这样引用变量值时可减少对内存的存取次数,以提高运行速度。    ② 当到基本块出口时,将变量的值存放在内存中,这样从基本块外入口的变量值都在内存中。    ③ 对于在一个基本块内后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存器的利用效率。    例:设一高级语言的语句为:A:=(B+C)*D+E 翻译成中间代码为: T1:=B+C T2:=T1*D A:=T2+E 问目标代码是什么 目标代码: LD R, B ADD R,C ST R , T1 LD R, T1 MUL R, D ST R, T2 LD R, T2 ADD R,E ST R,A 中间代码为: T1:=B+C T2:=T1*D A:=T2+E 如果不考虑代码的效率,我们可以翻译为如下代码: 从正确性看,没有问题,但却有很多冗余,因为T1,T2为临时变量,出了基本快 后将不会引用,因此,(3)(4)(6)(7)均可省掉,考虑到效率和充分利用寄存器的 问题,目标代码变为: LD R,B ADD R, C MUL R, D ADD R, E ST R , A A:=(B+C)*D+E 为了能够这样做,代码生成器必须了解一些信息:在产生T2:=T1*D对应的目标代码时,为了省去ST R,T1,就必须知道出了基本块后T1不会再利用。 为了省去指令LD R,T1,就必须知道T1的值已经在R中。 原目标代码: LD R, B ADD R,C ST R , T1 LD R, T1 MUL R, D ST R, T2 LD R, T2 ADD R,E ST R,A 中间代码为: T1:=B+C T2:=T1*D A:=T2+E 在一个基本块内考虑如何充分利用寄存器: l尽可能地让该变量的值保留在寄存器中 l尽可能引用变量在寄存器中的值 待用信息:若在一个基本块中,变量A在四元式i中被定值,在i后面的四元式j中要引用A值,且从i到j之间没有其它对A的定值点,称j是四元式i中对变量A的待用信息或称下次引用信息,同时也称A是活跃的。 若A被多处引用,则可构成待用信息链与活跃信息链。可从基本块的出口由后向前扫描,对每个变量建立相应的待用信息链和活跃变量信息链。 对各基本块的符号表中的“待用信息”栏和“活跃信息”栏置初值,即把“待用信息”栏置“非待用”,对“活跃信息”栏按在基本块出口处是否为活跃而置成“活跃”或“非活跃”。这里假定变量都是活跃的,临时变量都是非活跃的。 符号表中增加“待用信息”栏和“活跃信息”栏见P280 表12.4 从基本块出口到入口由后向前依次处理每个四元式。 对每个四元式 i: A:=B op C,依次执行下述步骤: a)把符

文档评论(0)

jiayou10 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档