[工学]第11章 目标代码生成.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文档。上传文档
查看更多
[工学]第11章 目标代码生成

中国科大 第十一章 目标代码生成 目标代码的形式 可立即执行的机器语言代码 通常存放在固定的存储区中,编译后可直接执行 节省时间,但缺乏灵活性,只用在程序不长时 待装配的机器语言模块 允许程序模块分别编译 调用其它先前编译好的程序模块 汇编语言代码 必须通过汇编程序将其汇编成可执行的机器语言代码 生成相应的符号化指令,易生成 考虑的两个问题(与目标代码的执行速度有关): 如何使生成的目标代码较短 如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数 本章内容 11.1 基本问题 11.2 目标机器模型 11.3 一个简单的代码生成器 11.4 寄存器分配 11.5 DAG的目标代码 11.6 窥孔优化 11.1 代码生成器设计中的问题 1、代码生成器的输入 2、目标程序 3、指令选择 4、寄存器分配 5、计算顺序选择 11.1 代码生成器设计中的问题 1、代码生成器的输入 包括源程序的中间表示以及符号表中的信息 11.1 代码生成器设计中的问题 2、 目标程序 代码生成器的输出是目标程序。 通常有三种形式: 绝对机器代码 可重定位机器语言 汇编语言 11.1 代码生成器设计中的问题 3、指令的选择 目标机器指令系统的性质决定了指令选择的难易程度,指令系统的统一性和完备性是重要的因素。如果目标机器不能支持指令集的所有类型,那么每一种例外都需要特别的处理。 指令的速度和机器用语是另一些重要的因素 11.1 代码生成器设计中的问题 若不考虑目标程序的效率,指令的选择是直 截了当的。 三地址语句x := y + z(x,y和z都是静态分配)可以翻译成下列代码序列: LD R0, y /* 把y装入寄存器R0 */ ADD R0 , z /* z加到R0上 */ ST R0, x /* 把R0存入x中 */ 11.1 代码生成器设计中的问题 4、寄存器分配 运算对象处于寄存器中的指令通常比运算对象处于内存的指令要短一些,执行也快一些。因此,如何充分利用计算机的寄存器,对于生成好的代码是非常重要的。 11.1 代码生成器设计中的问题 寄存器的使用可以分成两个子问题: (1)寄存器分配 选择驻留在寄存器中的一组变量 (2)寄存器指派 挑选变量要驻留的具体寄存器 11.1 代码生成器设计中的问题 5、计算次序的选择 顺序的选择会影响目标代码的效率,某种计算次序可能会比其它次序需要较少的寄存器来保存中间结果。 11.2 目标机器模型 要设计代码生成器,需预先熟悉目标机器和 它的指令系统 假设目标机器具有多个通用寄存器,它们 既可以作为累加器,也可以作为变址器。 这台机器含有以下四种类型的指令形式: 以上指令中的运算符(操作码)op包括一般计算机上常见的一些运算符,如: ADD 加 SUB 减 MUL 乘 DIV 除 11.3 一个简单的代码生成器 基本块范围内充分利用寄存器 计算结果留在寄存器中尽可能长的时间, 除非: 该寄存器要用于其它计算,或者 到基本块结束 后续代码尽可能引用变量在寄存器中的值,而不访问主存。 记录代码生成时需收集的信息 待用信息 为了把基本块内还要被引用的变量值尽可能保存在寄存器中,同时把基本块内不再被引用的变量所占用的寄存器及早释放 寄存器描述数组和变量地址描述数组 需掌握各寄存器的情况:空闲的还是已分配给某个变量(或几个变量),数组动态记录 动态记录着各变量现行值的存放位置:是在某寄存器中,还是在某主存单元中,或既在某寄存器中也在某主存单元中 11.4 寄存器分配 如何更有效地利用寄存器 考虑的范围从基本块扩大到循环 不是把寄存器平均分配给各个变量,而是把几个固定分配给几个变量 以各变量在循环内需访问主存单元的次数为准(引入执行代价) 11.5 DAG的目标代码 考虑问题: 为了生成更有效的目标代码,对基本块中中间代码序列,我们应按怎样的次序来生成目标代码呢? 例:考察下面基本块的中间代码序列G 利用DAG,把G改写成中间代码序列G’ 设R0和R1是两个可使用的寄存器。T4是基本块出口之后的活跃变量。G生成的目标代码如下: 从这个例子我们可以看到,生成中间代码序列目标代码的次序,将直接影响到目标代码的质量。 考虑问题: 为什么重新排序后的中间代码序列G’生成的目标代码优于原中间代码序列G生成的目标代码呢? 这是因为在G’中,T4是紧接在其左运算对象之后计算的。 这是因为在G’中,T4是紧接在其左运算对象之后计算的。 这样就可及时利用T1在寄存器中的值来计算T4的值,避免了算好T1

文档评论(0)

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

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

1亿VIP精品文档

相关文档