编译原理课件chapter8.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文档。上传文档
查看更多
8.5.2 代码生成算法 对每个形如 i:x:=y op z {下次引用信息} 依次执行下述步骤: ???1. L:= getreg(i:x:=y op z) L常常是一个寄存器,也可能是一个存储单 元,用来存放计算y op z所得的结果。 ??2. 考虑y的地址描述器以确定y?,y ?为y的值当 前的存放位置。若y的值同时在主存中和一 个寄存器中,那么y ?取寄存器更好。若y的 值尚不在L中,则生成指令: MOV y,L ????3.生成指令 op z,L 其中z‘为z的值存放的地址。同样,若z的值同 时存放在主存中和一个寄存器中,则取z‘为寄 存器。然后,更新x的地址描述器以记录x在L 中。如果L是一个寄存器,则更新这个寄存器 描述器以记录该寄存器存有x的值。 4.如果y和(或)z的当前值没有下次引用,在 基本块的出口又是非活跃的,并且是在寄存器 中,则更新y的和(或)z的寄存器描述器和地 址描述器以表示,在执行i:x:=y op z之后, 这些寄存器不再包含y和(或)z的值。 ????一旦处理完一个基本块的所有三地址语句, 生成 MOV Rx, Mx 存储那些在基本块的出口处是活跃的并且还 不在它的存储单元中的名字x的值。为进行这 一工作,使用寄存器描述器来确定哪些名字的 当前值仍保留在寄存器中,使用地址描述器来 确定其中哪些名字的当前值还不在它的存储单 元里,使用活跃变量信息来确定是否需要存储 其当前值。 ????实现函数 getreg(i:x:=y op z) 简单方法: (1)y的值是在一个寄存器中,且该寄存器不保 留其它任何名字的值,并且在执行x:=y op z 以后y为“非活跃”“无下次引用”,那么就返回 y的寄存器作为L,并更新 y的地祉描述器以表 示y已不在L; (2)如果(1)失败,则当有空寄存器时,就返回 一个这样的寄存器; ?? (3)如果(2)失败,若x在该基本块中有一个 下次引用,或者op是一个需要寄存器的算符 ,则找一个已被占用的寄存器R。如果R的 值尚未在存储单元中,则 将R的值存放到一 个单元M中,并且更新地址描述器为M。如果 R同时保存了几个变量的值,则对每个需要 存储的变量值都应生成一条MOVE指令。 (4)如果x在该基本块中不再被引用,或者没有 找到合适的被占用的寄存器,则选择x的存 储单元作为L。 * * 第八章 代码生成 序 8.1 目标机器 8.2 运行存储管理 8.3 基本块和流图 8.4 下次引用信息 8.5 一个简单的代码生成器 序 代码生成器 中间代码 符号表 目标代码 中间代码: 后缀式,三地址代码,语法树。 符号表中的项:名字,类型, 嵌套深度,偏移量 目标代码:绝对机器代码,可再定位代码,汇编 8.1 目标机器 ? ??? 按字节编址,以4个字节为一个字. 通用寄存器R0,R1,…,Rn-1。 两地址指令形式: op source,destination 其中op是一个操作码,source和destination称为源和目的,是数据域。例如有如下的操作码: MOV (将源移到目的中) ADD (将源加到目的中) SUB (在目的中减去源) contents(a)表示由a所代表的寄存器或存储单元的内容。 ????有关地址方式及它们的汇编语言形式和有关开销如表8.1所示。 表8.1 目标机器的地址方式 指令开销 ????开销是与一条指令的长度(按字计算)相对应的。对绝大多数机器和绝大多数指令而言,用来从存储器中获取一条指令的时间超过了执行该指令的时间。 指令开销=源地址开销?+目的地址开销+1 ? 1.MOV R0,R1 1 ????2.MOV R5,M

文档评论(0)

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

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

1亿VIP精品文档

相关文档