- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
6.3.2下次引用信息与活跃信息为了生成好的目标代码,需要知道变量的值下次什么时候被使用。如果一个变量的值当前在寄存器中并且以后再也不被使用,则该寄存器就可以分配给其他变量。定义6.4在形如(i)x:=yopz的三地址码中,出现在“:=”左边和右边的变量分别被称为对变量的定值和引用,i被称为变量的定值点或引用点。若变量的值在i之后的代码序列中被引用,则称变量在i点是活跃的。若变量x在i点被定值,在j点被引用,且从i到j没有x的其他定值,则称j是i中变量x的下次引用信息,所有这样的下次引用信息jk(k?=?1,2,…)构成一个下次引用链。一个变量x可以多次被定值,一次定值后又可以多次被引用。当一个变量x最后一次被引用之后,就不再活跃了,因此一个变量x在其下次引用链的范围内总是活跃的。目标代码生成需要确定三地址码语句x:=yopz中x、y和z的下次引用信息。下述算法通过对基本块的逆向扫描计算变量的下次引用和活跃信息。算法6.2确定基本块中每条语句的活跃信息与下次引用信息输入三地址码语句的基本块B。输出对B中的每一语句i:x:=yopz,为i附加上x、y和z的活跃信息和下次引用信息。方法假设一开始B中的所有非临时变量是活跃的,且临时变量是不活跃的。从B的结束语句开始逆向扫描到B的开始,对每条语句i:x:=yopz进行下述操作:(1)将当前符号表中x、y和z的活跃信息和下次引用信息附加在语句i(的变量)上。(2)在符号表中置x为“不活跃”和“非下次引用”。(3)在符号表中置y和z为“活跃”并且y和z的下次引用为i。如果三地址码语句i形如x:=opy或x:=y,则步骤同上但是忽略z。注意步骤(2)和(3)的次序不能交换,因为x也可能是y或z。【例6.4】在下述左边的基本块中,设a、b、c、d是程序中变量,t、u、v是临时变量。如果我们用F分别标记“非下次引用”和“不活跃”,用L标记“活跃”,用(i)标记三地址码位置,则下述右边的基本块中给出了各变量或临时变量的下次引用信息和活跃信息,用算法6.2从(4)到(1)依次计算下次引用信息和活跃信息的过程如表6.4所示,其中信息填写的形式是“下次引用/活跃”。表6.4下次引用信息与活跃信息的计算6.3.3简单的代码生成代码生成的基本依据是变量的下次引用信息与活跃信息,以及寄存器的分配原则。下边首先规定寄存器的分配原则,然后在此原则下对寄存器和地址的信息进行适当的描述,并且设计如何为名字选择存储位置(getreg函数),在此基础上生成目标代码。1.寄存器的分配原则在指令的执行代价中,寄存器的代价最小,因此总是希望将尽可能多的运算对象放在寄存器中。由于任何一个计算机模型中的寄存器个数都是有限的,所以需要根据一些原则对寄存器进行分配。下述是基于基本块的寄存器分配的一般原则:(1)当生成某变量的目标代码时,让变量的值或计算结果尽量保留在寄存器中,直到寄存器不够分配时为止,这样可以减少对内存的存取次数,降低代价。(2)当到基本块结束语句时,将变量的值存放在内存中。因为一个基本块可能有多个后继节点,同一个变量名在不同前驱节点的基本块内结束语句前存放的R可能不同,或没有定值,所以应该在结束语句前把寄存器的内容放在内存中,从而使得每个变量进基本块时,值均在内存中。(3)对于在一个基本块内、后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存器的利用效率。2.寄存器与内存地址的描述符代码生成器使用描述符来跟踪寄存器的内容和名字的地址。寄存器描述符跟踪当前在每个寄存器中的内容,当需要一个新寄存器时就查找描述符。假设初始状态寄存器描述符对所有寄存器为空(若寄存器被跨基本块赋值,则假设可能不成立)。随着基本块中代码的生成,每个寄存器在任何时刻可能持有0个或若干个名字的值。地址描述符跟踪运行时可以在其中找到名字当前值的存储位置,该位置可以是寄存器、栈中某单元、内存地址或它们的集合。该信息可以存放在符号表中,用于确定对一个名字的存取方式。3.getreg函数getreg函数为赋值x:=yopz返回一个持有x值的存储位置L。如何选择L是一个复杂的问题,此处仅讨论一个简单且易于实现的方法,此方法基于前边所讨论过的下次引用信息。该方法的主要步骤如下:(1)若名字y在不含其他名字的寄存器中(通过拷贝可以使一个寄存器中持有若干名字的值),并且在执行过x:=yopz之后不再被引用也不活跃,则返回y的寄存器作为L。修改y的地址描述符以指出y已不在L中。(2)若(
您可能关注的文档
最近下载
- 保险金信托培训.pptx VIP
- 2025年党支部换届选举工作实施方案.doc VIP
- 皮肤组织病理学基本变化与皮肤病诊疗新进展题库及答案-2025年华医网继续教育.docx VIP
- 03新区基层党组织选举指导手册.doc VIP
- 中国成人失眠诊断与治疗指南(2023版)解读-20241011100546.pptx VIP
- 信管专业信息计量学考试复习整理资料.docx VIP
- 高铁时代下京沪广深机场经营效率的多维审视与提升策略.docx
- 吸烟亭建设服务质量保障措施.doc VIP
- 2023年梅河口市事业编教师考试真题(含答案).pdf VIP
- 2025年梅河口市教育系统教师招聘考试笔试试题(含答案).pdf
原创力文档


文档评论(0)