- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
W在R2中 R2中有W LD R2 T2 DIV R2 R1 空闲的R2 W:=T2/T5 ST R2 W T5在R1中 R1中有T5 SUB R1 R2 T3独占R1 T5:=T3-T4 T4在R2中 T3在R1中 R2中有T4 R1中有T3 ST R2 T2 LD R2 F ADD R2 G 释放R2 T4:=F+G T2在R2中 T3在R1中 R2中有T2 R1中有T3 LD R1 D MUL R1 E 空闲的R1 T3:=D*E T2在R2中 R2中有T2 LD R2 C SUB R2 R1 空闲的R2 T2:=C-T1 T1在R1中 R1中有T1 LD R1 A ADD R1 B 空闲的R1 T1:=A+B AVALUE RVALUE 目标代码 选取R 四元式 本章小结 以一个假想的机器指令系统为基础,介绍目标代码生成所涉及的共性问题: 基本块的代码生成算法 寄存器分配算法 变量的待用信息和活跃信息 第十二章代码生成 第十二章代码生成 第12章 代码生成 学习目标 掌握:基本块代码生成算法,寄存器分配算法 理解:待用信息,活跃信息 12.1 代码生成概述 12.2 一个计算机模型 12.3 一个简单的代码生成器 12.1 代码生成概述 代码生成的任务 把中间代码(经过优化或未经过优化)作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器(Code Generator)。 目标代码生成需要考虑的基本问题: 如何使生成的目标代码较短 如何充分利用计算机的寄存器,减少目标代码访问存储单元的次数 目标代码生成的一些共同的问题,而不讨论某个特定机器的代码生成问题 寄存器分配算法 目标代码的执行效率很大程度依赖于寄存器的使用; 基本块的代码生成算法 寄存器分配算法仅限定在一个基本块的范围内,以四元式的中间代码作为输入,以一个称作M的模型机的汇编语言作为输出。 12.2 一个计算机模型 M模型机具有n个通用寄存器R1,R2,R3,…,Rn,它们既可以作为累加器,又可以作为变址器。 约定:op表示运算,C表示常量;M表示内存单元(用变量名表示该变量所在的单元), Ri表示寄存器;*表示间接寻址 寻址类 型 指令格式 意义(设op是二目算符) 直接型 op Ri , M (Ri) op (M) = Ri 寄存器型 op Ri , Rj (Ri) op (Rj) = Ri 变址型 op Ri , c(Rj) (Ri) op ((Rj)+c) = Ri 间接型 op Ri , *M (Ri) op ((M)) = Ri ? op Ri , *Rj (Ri) op ((Rj))= Ri ? op Ri , *c(Rj) (Ri) op (((Rj)+c)) = Ri 指令系统与寻址方式 令X代表Ri或者M,则(X)表示直接取X的内容作为操作对象,((X))表示一层间接,即取X的内容作为地址 特殊指令 除了上述的寻址方式和一般的运算指令之外,计算机模型的指令系统中还包括如下特殊指令 主要有两大类: 内存与寄存器交换类:包括LD与ST; 比较与转移类:如CMP与J X 等于零转X单元 Jz X 将A单元与B单元的值进行比较,把结果置入状态字(CT) CMP A, B 不为零转X单元 Jnz X 无条件转向X单元 J X 等于转X单元 J= X 把寄存器Ri的内容存回存储单元B,即(Ri) = B ST Ri , B 小于转X单元 J X 把存储单元B的内容装入寄存器Ri,即(B) = Ri LD Ri , B 意义 指令 意义 指令 例:条件语句 if AB goto X 中间代码:( J, A, B, X ) 目标代码: CMP A, B J X 12.3 一个简单的代码生成器 一个基于基本块的代码生成器 它的输入是四元式中间代码,输出是M机器的汇编代码 着重讨论在基本块内如何充分利用寄存器 12.3.1 寄存器分配原则 在指令的执行代价中,寄存器的代价是最小的,因此总是希望将尽可能多的运算对象放在寄存器中; 由于任何一个计算机模型中的寄存器个数都是有限的,因而需要根据一些原则,对寄存器进行分配 基于基本块的寄存器分配的一般原则: 当生成某变量的目标代码时,尽量让变量的值或中间结果保留在寄存器中,直到寄存器不够分配为止,这样引用变量值时可减少对内存的存取次数,提高运行速度 进入基本块时所有寄存器是空闲的,当到基本块出口时,将变量的有用值存回内存,释放所有寄存器 在基本块内,后边不再被引用的变量占用的寄存器应尽早释放,以提
文档评论(0)