编译原理刘善梅第11章代码生成2_第1页
编译原理刘善梅第11章代码生成2_第2页
编译原理刘善梅第11章代码生成2_第3页
编译原理刘善梅第11章代码生成2_第4页
编译原理刘善梅第11章代码生成2_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理第十一章第十一章 代码生成代码生成第十一章第十一章 代码生成代码生成n基本问题基本问题n目标机器模型目标机器模型n一个简单代码生成器一个简单代码生成器n代码生成代码生成是把语法分析后或优化后的中间代是把语法分析后或优化后的中间代码变换成目标代码。码变换成目标代码。n目标代码一般有以下三种形式:目标代码一般有以下三种形式:绝对指令代码:绝对指令代码:能够立即执行的机器语言代码,能够立即执行的机器语言代码,所有地址已经定位;所有地址已经定位;可重新定位指令代码:可重新定位指令代码:也是机器指令,但这些机也是机器指令,但这些机器指令中的地址分配是以模块为单位进行的,是器指令中的地址分配是以模

2、块为单位进行的,是相对于本模块的相对地址;这种代码必须经过相对于本模块的相对地址;这种代码必须经过链链接接程序,把若干个模块的这种可重定位的指令代程序,把若干个模块的这种可重定位的指令代码连接成一个绝对指令代码,要把相对地址通过码连接成一个绝对指令代码,要把相对地址通过这个链接程序变成绝对地址;这个链接程序变成绝对地址;汇编语言代码:汇编语言代码:尚须经过汇编程序汇编,转换成尚须经过汇编程序汇编,转换成可执行的机器语言代码。可执行的机器语言代码。n代码生成着重考虑的问题:代码生成着重考虑的问题:如何使生成的目标代码如何使生成的目标代码较短较短;如何充分利用计算机的如何充分利用计算机的寄存器寄存

3、器,减少目标代,减少目标代码中访问存贮单元的次数。码中访问存贮单元的次数。如何充分利用计算机的如何充分利用计算机的指令系统的特点指令系统的特点。11.1 基本问题基本问题 n代码生成器的输入代码生成器的输入 代码生成器的输入包括源程序的中间表示,以代码生成器的输入包括源程序的中间表示,以及符号表中的信息及符号表中的信息类型检查类型检查nx:=yi*j 其中其中x、y为实型;为实型;i、j为整型。这个赋值句产生的为整型。这个赋值句产生的三地址代码为:三地址代码为: t1:=i int* j t3:=inttoreal t1 t2:=y real+ t3 x:=t2 11.1 基本问题基本问题 n

4、目标程序目标程序 :绝对机器代码、可再定位机器语言、汇编语言绝对机器代码、可再定位机器语言、汇编语言采用汇编代码作为目标语言采用汇编代码作为目标语言 n指令选择:指令选择:充分利用计算机的充分利用计算机的指令系统的特点指令系统的特点如如 a:=a+1/若机器有自加若机器有自加+指令,则选择自加指令指令,则选择自加指令inc a 来实现来实现ninc a/若机器上没有自加指令,则用以下三条指令来实现若机器上没有自加指令,则用以下三条指令来实现nld r0, a add r0, #1 st r0, a 11.1 基本问题基本问题 n寄存器分配寄存器分配 在在寄存器分配寄存器分配期间,为程序的某一点

5、期间,为程序的某一点选择驻留选择驻留在寄存器中的一组变量在寄存器中的一组变量。在随后的在随后的寄存器指派寄存器指派阶段,阶段,挑出变量将要驻留挑出变量将要驻留的具体寄存器的具体寄存器。n计算顺序选择:计算顺序选择:如果需要用到的数据刚好就是刚刚在如果需要用到的数据刚好就是刚刚在寄存器中算出来的数据,这样的计算顺序安排可节约访问寄存器中算出来的数据,这样的计算顺序安排可节约访问存储器的时间,从而提高效率存储器的时间,从而提高效率第十一章第十一章 代码生成代码生成n基本问题基本问题n目标机器模型目标机器模型n一个简单代码生成器一个简单代码生成器11.2 目标机器模型目标机器模型 n考虑一个抽象的计

6、算机模型考虑一个抽象的计算机模型具有多个通用寄存器,他们既可以作为累加器,具有多个通用寄存器,他们既可以作为累加器,也可以作为变址器。也可以作为变址器。运算必须在某个寄存器中进行。运算必须在某个寄存器中进行。含有四种类型的指令形式含有四种类型的指令形式类类 型型指令形式指令形式意义意义(设设 op 是二目运是二目运算符算符)直接地址型直接地址型op ri, m(ri) op (m) ri寄存器型寄存器型op ri, rj(ri) op (rj) ri变址型变址型op ri, c(rj)(ri) op (ri)+c) ri间接型间接型op ri, *mop ri, *rjop ri, *c(rj

7、) (ri) op (m) ri(ri) op (rj) ri(ri) op (rj)+c) ri如果如果op是一目运行符,则是一目运行符,则“op ri, m”的意的意义为:义为:op(m) ri,其余类型可类推。,其余类型可类推。op 包括一般计算机上常见的一些运算符,如包括一般计算机上常见的一些运算符,如add,sub,mul,div指指 令令意意 义义ld ri, b把把 b 单元的内容取到寄存器单元的内容取到寄存器 r,即,即(b) rist ri, b把寄存器把寄存器 ri的内容存到的内容存到 b 单元,即单元,即(ri) bj x无条件转向无条件转向 x 单元单元cmp a, b

8、 把把 a 单元和单元和 b 单元的值进行比较,并根据比较单元的值进行比较,并根据比较情况把机器内部特征寄存器情况把机器内部特征寄存器 ct 置成相应状置成相应状态。态。 ct 占两个二进位。 根据占两个二进位。 根据 ab分别置分别置 ct 为为 0 或或 1 或或 2。j x如如 ct=0 转转 x 单元单元j x如如 ct=0 或或 ct=1 转转 x 单元单元j x如如 ct=1 转转 x 单元单元j x如如 ct1 转转 x 单元单元j x如如 ct=2 转转 x 单元单元j x如如 ct=2 或或 ct=1 转转 x 单元单元n不考虑代码的执行效率,目标代码生成不考虑代码的执行效率

9、,目标代码生成是不难的,例如:是不难的,例如:a:=(b+c)*d+e翻译为四元式:翻译为四元式:t1:=b+ct2:=t1*dt3:=t2+ea:=t3 11.3 一个简单代码生成器一个简单代码生成器g假设只有一个寄存器可供使用假设只有一个寄存器可供使用目标代码:目标代码: ld r0,badd r0 ,cst r0 ,t1假设假设t1,t2,t3在基本块之在基本块之后不再引用后不再引用:ld r0,badd r0,cmul r0,dadd r0,est r0,a 四元式四元式t1:=b+ct3:=t2+et2:=t1*da:=t3 ld r0 ,t1mul r0,dst r0 ,t2ld

10、r0 ,t2add r0 ,est r0 ,t3ld r0,t3 st r0 ,a11.3 一个简单代码生成器一个简单代码生成器n四元式的中间代码变换成目标代码,并在一个四元式的中间代码变换成目标代码,并在一个基本块的范围内考虑如何充分利用寄存器:基本块的范围内考虑如何充分利用寄存器:尽可能留尽可能留:在生成计算某变量值的目标代码在生成计算某变量值的目标代码时,尽可能让该变量保留在寄存器中。时,尽可能让该变量保留在寄存器中。尽可能用:尽可能用:后续的目标代码尽可能引用变量后续的目标代码尽可能引用变量在寄存器中的值,而不访问内存。在寄存器中的值,而不访问内存。及时腾空及时腾空:在离开基本块时,把

11、存在寄存器:在离开基本块时,把存在寄存器中的现行的值放到主存中。中的现行的值放到主存中。11.3.1 待用信息待用信息n如果在一个基本块内,四元式如果在一个基本块内,四元式i对对a定值,定值,四元式四元式j要引用要引用a值,而从值,而从i到到j之间没有之间没有a的其他定值,那么,我们称的其他定值,那么,我们称j是四元式是四元式i的的变量变量a的的待用信息待用信息。(即下一个引用点)。(即下一个引用点)i: a:=b op cj: d:=a op en假设在变量的符号表登记项中含有记录假设在变量的符号表登记项中含有记录待用信息和活跃信息的栏。待用信息和活跃信息的栏。n待用信息和活跃信息的表示:待

12、用信息和活跃信息的表示:1 (x,x)表示变量的待用信息和活跃信息。表示变量的待用信息和活跃信息。其中其中i表示待用信息表示待用信息,y表示活跃表示活跃,表示表示非待用和非活跃;非待用和非活跃;2 在符号表中,在符号表中,(x,x)(x,x)表示后面表示后面的符号对代替前面的符号对;的符号对代替前面的符号对;3 不特别说明,不特别说明,所有所有说明说明变量变量在基本块出在基本块出口之后口之后均为非活跃变量均为非活跃变量。例:基本块例:基本块1. t:=a-b2. u:=a-c3. v:=t+u4. w:=v+u设设w是基本块出口之后的活跃变量。是基本块出口之后的活跃变量。(4)w:=v+u(3

13、)v:=t+u(2)u:=a-c(1)t:=a-b(,y)(,)(,)(4,y)(,)(4,y)(3,y)(,)(,) (3,y)(2,y)(,) 序号序号 四元式四元式 左值左值 左操作数左操作数 右操作数右操作数n计算待用信息和活跃信息的算法步骤:计算待用信息和活跃信息的算法步骤:1. 开始时开始时,把基本块中各变量的符号表登,把基本块中各变量的符号表登记项中的待用信息栏填为记项中的待用信息栏填为“非待用非待用”,并并根据该变量在基本块出口之后是不是根据该变量在基本块出口之后是不是活跃的活跃的,把其中的活跃信息栏填为,把其中的活跃信息栏填为“活活跃跃”或或“非活跃非活跃”;2. 从基本块出

14、口到基本块入口从基本块出口到基本块入口由后向前由后向前依次处依次处理各个四元式。对每一个四元式理各个四元式。对每一个四元式i: a:=b op c,依次执行下面的步骤:,依次执行下面的步骤: 1) 把符号表中变量把符号表中变量a的待用信息和活跃信息的待用信息和活跃信息附加到四元式附加到四元式i上;上; 2) 把符号表中把符号表中a的待用信息和活跃信息分别的待用信息和活跃信息分别置为置为“非待用非待用”和和“非活跃非活跃”; 3) 把符号表中变量把符号表中变量b和和c的待用信息和活跃的待用信息和活跃信息附加到四元式信息附加到四元式i上;上; 4) 把符号表中把符号表中b和和c的待用信息均置为的待

15、用信息均置为i,活,活跃信息均置为跃信息均置为“活跃活跃”。例:基本块例:基本块1. t:=a-b2. u:=a-c3. v:=t+u4. w:=v+u设设w是基本块出口之后的活跃变量。是基本块出口之后的活跃变量。建立待用信息链表与活跃变量信息链表建立待用信息链表与活跃变量信息链表n附加在四元式上的待用附加在四元式上的待用/活跃信息表:活跃信息表:(4)w:=v+u(3)v:=t+u(2)u:=a-c(1)t:=a-b(,y)(,)(,)(4,y)(,)(4,y)(3,y)(,)(,) (3,y)(2,y)(,) 序号序号 四元式四元式 左值左值 左操作数左操作数 右操作数右操作数变量名变量名

16、初始状态初始状态信息链信息链(待用待用/活跃信息栏活跃信息栏) (3,y) (,) (2,y) (1,y) (1,y) (2,y) (4,y) (,) (3,y)t(,)a(,)b(,)c(,)u(,)v(,)w (,y) (,) (4,y) (,)n寄存器描述数组寄存器描述数组rvalue动态记录各寄存器的使用信息动态记录各寄存器的使用信息rvaluer=a,bn变量地址描述数组变量地址描述数组avalue动态记录各变量现行值的存放位置动态记录各变量现行值的存放位置avaluea=r1, r2, a寄存器描述和变量地址描述寄存器描述和变量地址描述n补充说明:补充说明:因为因为寄存器的分配寄存

17、器的分配是是局限于基本块范围之局限于基本块范围之内内的,一旦处理完基本块中所有四元式,的,一旦处理完基本块中所有四元式,对现行值在寄存器中的每个变量,如果它对现行值在寄存器中的每个变量,如果它在基本块之后是活跃的,则要把它存在寄在基本块之后是活跃的,则要把它存在寄存器中的值存放到它的主存单元中。存器中的值存放到它的主存单元中。要特别强调的是,对形如:要特别强调的是,对形如:a:=b的四元式,的四元式,如果如果b的现行值在某寄存器的现行值在某寄存器ri中,则无须生中,则无须生成目标代码,只须在成目标代码,只须在rvalue(ri)中增加一中增加一个个a,(即把即把ri同时分配给同时分配给b和和a

18、),并把,并把avalue(a)改为改为ri 。n代码生成算法:代码生成算法:对每个四元式对每个四元式: i: a:=b op c,依次执行:,依次执行: 1. 以四元式以四元式: i: a:=b op c 为参数,为参数,调用函调用函数过程数过程getreg(i: a:=b op c),返回一返回一个寄存器个寄存器r,用作存放,用作存放a的寄存器。的寄存器。 2. 利用利用avalueb和和avaluec,确定,确定b和和c现行值的存放位置现行值的存放位置b和和c。如果其现。如果其现行值在寄存器中,则把寄存器取作行值在寄存器中,则把寄存器取作b和和c 3. 如果如果br,则生成目标代码:,则

19、生成目标代码: ld r, b op r, c 否则生成目标代码否则生成目标代码 op r, c 如果如果b或或c为为r,则删除,则删除avalueb或或avaluec中的中的r。 4. 令令avaluea=r, rvaluer=a。 5. 若若b或或c的现行值在基本块中不再被引用,的现行值在基本块中不再被引用,也不是基本块出口之后的活跃变量,且其也不是基本块出口之后的活跃变量,且其现行值在某寄存器现行值在某寄存器rk中,则删除中,则删除rvaluerk中的中的b或或c以及以及avalueb或或avaluec 中的中的rk ,使得该寄存器不再,使得该寄存器不再为为b或或c占用。占用。及时腾空及时腾空n寄存器分配寄存器分配:getreg(i: a:=b op c) 返返回一个用来存放回一个用来存放a的值的寄存器的值的寄存器1 如 果如 果 b 的 现 行 值 在 某 个 寄 存 器的 现 行 值 在 某 个 寄 存 器 ri中 ,中 ,rvalueri中只包含中只包含b,此外,或者,此外,或者b与与a是是同一个标识符同一个标识符,或者,或者b的现行值在执行四元式的现行值在执行四元式a:=b op c之后不会再引用之后不会再引用,则选取,则选取ri为所需为所需要的寄存器要的寄存器r,并转,并转4;2 如果有尚未分配的寄存器,则从中选取一个如果有尚未分配的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论