- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《编译原理实践及应用》第8章代码生成.ppt
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 简单的代码生成算法 对每个三地址语句x = y op z完成下列动作 1. 调用函数getreg决定存放y op z计算结果的场所L,L通常是寄存器,也可以是内存单元 2 查看y的地址描述,确定y值当前的一个场所y ‘ 。如果y值当前既在内存单元又在寄存器中,选择寄存器作为y‘。如果y的值还不再L中,则产生指令MOV y , L 3 产生指令op z ‘, L,其中z ‘是z的当前场所值一(同2一样优先选择寄存器)修改x的地址描述,以表示x在场所L。如果L是寄存器,修改它的描述,以表示它含x的值 4 如果y和(或)z的当前值不再引用,在块的出口也不活跃,并且在寄存器中,则修改寄存器描述,以表示在执行了x = y op z后,这些寄存器分别不再含y和(或)z的值 基本块结束的处理 在基本块的出口,用MOV指令把在寄存器中的活跃变量的值保存 值在寄存器中 这个值在出口活跃 复写语句的处理:x = y y在寄存器中 改变寄存器和地址的描述,记住x的值出现在该寄存器中 如果y不再引用,且在块的出口不活跃,该寄存器不再保存y的值 y的值仅在内存中 若记住x的值在y的内存单元中,但如果更新y的值复杂;可以用getreg找到一个存放y的寄存器,并记住该寄存器是存放x的场所 或产生指令MOV y , x,如果x在块中不再引用,此法较好 函数getreg:返回保存语句x = y op z的x值的场所L 简单的实现方法:基于下次引用信息 1. 如果名字y在寄存器中,此寄存器不含其它名字的值,并且y不活跃,且在执行x = y op z后没有下次引用,则返回y的这个寄存器作为L 2. 1失败时,如果有的话,返回一个空闲寄存器 3. 2不成功时,如果x在块中有下次引用,或op是必须使用寄存器的算符(如变址),则找一个已被占用的寄存器R 将R中的值根据存有的变量(可能不止一个)保存到内存单元中,并修改相关的地址描述 R的选择要考虑spill的代价 4. 如果x在本块中不再引用,或者找不到适当的被占用寄存器,则选择x的内存单元作为L 例:赋值语句d = ( a – b ) + ( a – c ) + ( a – c ) 可以翻译成下面的三地址代码序列 : t = a – b ; u = a – c ; v = t + u ; d = v + u d在出口活跃,产生的代码序列: 语 句 生成的代码 寄存器描述 地址描述 寄存器空 t = a – b MOV a , R0 R0含t SUB b , R0 t在R0中 u = a – c MOV a , R1 R0含t t在R0中 SUB c , R1 R1含u u在R1中 v = t + u ADD R1 , R0 R0含v u在R1中 R1含u v在R0中 d = v + v ADD R1 , R0 R0含d d在R0中 MOV R0 , d d在R0和内存中 上述代码的代价为12 可以在第一个指令后增加MOV R0 , R1,从而将代价减少为11(删去了MOV a , R1) 条件语句的代码生成 两种实现方式,以if x y goto z为例 根据寄存器的值是否为下面6个条件之一进行分支:负、零、正、非负、非零和非正 把x减y的值存入寄存器R 如果R的值为负,则跳到z 用条件码来表示计算的结果和装入寄存器的值是负、零还是正 比较指令(CMP)设置条件码而不真正计算值,如果x y,则CMP x , y置条件码为正等 条件转移机器指令根据指定的条件( , = , , = , , =)是否满足来决定是否转移,如果用指令CJ= z表示如果条件码是负或零则转到z,所以有 CMP x , y CJ z 条件码的描述的记录 条件码的描述的记录告诉我们上次设置条件码的名字和比较的名字对 x = y + z MOV y , R0 if x 0 goto z ADD z , R0 MOV R0 , x CJ z 根据条件码描述可以知道,在ADD z , R0之后,条件码是由x设置的 练习:将下属赋值语句生成目标代码: T1 = A+B MOV R0, A T2 =C+D ADD R0, B T3 =E-T2
文档评论(0)