版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1编译原理编译原理第十一章第十一章 目标代码生成目标代码生成王金伟计算机与信息工程学院天津师范大学2词法分析器词法分析器语法分析器语法分析器中间代码生成器中间代码生成器优化段优化段源程序源程序单词符号单词符号语法单位语法单位四元式四元式表表格格管管理理出出错错处处理理目标代码生成器目标代码生成器四元式四元式目标代码目标代码3n代码生成代码生成是把语法分析后或优化后的中间代码变换成目是把语法分析后或优化后的中间代码变换成目标代码。标代码。n目标代码一般有以下三种形式:目标代码一般有以下三种形式:能够立即执行的机器语言代码能够立即执行的机器语言代码,所有地址已经定位;,所有地址已经定位;待装配的机
2、器语言模块待装配的机器语言模块。执行时,由连接装配程序把。执行时,由连接装配程序把它们和某些运行程序连接起来,转换成能执行的机器它们和某些运行程序连接起来,转换成能执行的机器语言代码;语言代码;汇编语言代码汇编语言代码。尚须经过汇编程序汇编,转换成可执。尚须经过汇编程序汇编,转换成可执行的机器语言代码。行的机器语言代码。4n代码生成着重考虑的问题:代码生成着重考虑的问题:如何使生成的目标代码较短;如何使生成的目标代码较短;如何充分利用计算机的寄存器,减少目标代码中访如何充分利用计算机的寄存器,减少目标代码中访问存贮单元的次数。问存贮单元的次数。如何充分利用计算机的指令系统的特点。如何充分利用计
3、算机的指令系统的特点。511.1 基本问题基本问题 n代码生成器的输入代码生成器的输入 代码生成器的输入包括源程序的中间表示,以及符号代码生成器的输入包括源程序的中间表示,以及符号表中的信息,代码生成器可以利用符号表中的信息来表中的信息,代码生成器可以利用符号表中的信息来决定在中间代码中的名字所指示的数据对象的运行时决定在中间代码中的名字所指示的数据对象的运行时地址。地址。类型检查,假定已经作过必要的类型检查,在必要的类型检查,假定已经作过必要的类型检查,在必要的地方已经加上了类型转换操作,并已检测出一些明显地方已经加上了类型转换操作,并已检测出一些明显的语义错误。代码生成阶段就可以假设它的输
4、入是没的语义错误。代码生成阶段就可以假设它的输入是没有错误的。有错误的。6n目标程序目标程序 绝对机器代码、可再定位机器语言、汇编语言绝对机器代码、可再定位机器语言、汇编语言采用汇编代码作为目标语言采用汇编代码作为目标语言 n指令选择指令选择一个有着丰富指令集的机器可以为一个给定的操作提供一个有着丰富指令集的机器可以为一个给定的操作提供几种实现方法。几种实现方法。a:=a+1nINC a nLD R0, a ADD R0, #1 ST R0, a 7n寄存器分配寄存器分配 在寄存器分配期间,为程序的某一点在寄存器分配期间,为程序的某一点选择驻留在寄存器选择驻留在寄存器中的一组变量中的一组变量。
5、在随后的寄存器指派阶段,在随后的寄存器指派阶段,挑出变量将要驻留的具体寄挑出变量将要驻留的具体寄存器存器。n计算顺序选择计算顺序选择影响目标代码的有效性。影响目标代码的有效性。811.2 目标机器模型目标机器模型 n考虑一个抽象的计算机模型考虑一个抽象的计算机模型具有多个通用寄存器,他们既可以作为累加器,也可具有多个通用寄存器,他们既可以作为累加器,也可以作为变址器。以作为变址器。运算必须在某个寄存器中进行。运算必须在某个寄存器中进行。含有四种类型的指令形式含有四种类型的指令形式9如果如果op是一目运行符,则是一目运行符,则“op Ri, M”的意的意义为:义为:op(M) Ri,其余类型可类
6、推。,其余类型可类推。10op 包括一般计算机上常见的一些运算符,如包括一般计算机上常见的一些运算符,如ADD加加SUB减减MUL乘乘DIV除除11指指 令令意意 义义LD Ri, B把把 B 单单元元的的内内容容取取到到寄寄存存器器 R,即即(B) RiST Ri, B把把寄寄存存器器 Ri的的内内容容存存到到 B 单单元元,即即(Ri) BJ X无无条条件件转转向向 X 单单元元CMP A, B 把把 A 单单元元和和 B 单单元元的的值值进进行行比比较较,并并根根据据比比较较情情况况把把机机器器内内部部特特征征寄寄存存器器 CT 置置成成相相应应状状态态。 CT 占占两两个个二二进进位位
7、。 根根据据 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 单单元元12n不考虑代码的执行效率,目标代码生成是不难的,不考虑代码的执行效率,目标代码生成是不难的,:A:=(B+C)*D+E翻译为四元式:翻译为四元式:T1:=B+CT2:=T1*DT3:=T2+EA:=T3 11.3 一个简单代码生成器一个简单代码生成器13G假设
8、只有一个寄存器可供使用假设只有一个寄存器可供使用目标代码:目标代码: 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 R0 ,T2ADD R0 ,EST R0 ,T3LD R0,T3 ST R0 ,A14n四元式的中间代码变换成目标代码,并在一个基本块四元式的中间代码变换成目标代码,并在一个基本块的范围内考虑如何充分利用寄存
9、器:的范围内考虑如何充分利用寄存器:尽可能留尽可能留:在生成计算某变量值的目标代码时,尽在生成计算某变量值的目标代码时,尽可能让该变量保留在寄存器中。可能让该变量保留在寄存器中。尽可能用:尽可能用:后续的目标代码尽可能引用变量在寄存后续的目标代码尽可能引用变量在寄存器中的值,而不访问内存。器中的值,而不访问内存。及时腾空及时腾空:在离开基本块时,把存在寄存器中的现:在离开基本块时,把存在寄存器中的现行的值放到主存中。行的值放到主存中。1511.3.1 待用信息待用信息n如果在一个基本块内,四元式如果在一个基本块内,四元式i对对A定值,四元式定值,四元式j要引要引用用A值,而从值,而从i到到j之
10、间没有之间没有A的其他定值,那么,我们的其他定值,那么,我们称称j是四元式是四元式i的变量的变量A的的待用信息待用信息。(即下一个引用点)。(即下一个引用点)i: A:=B op Cj: D:=A op En假设在变量的符号表登记项中含有记录待用信息和活假设在变量的符号表登记项中含有记录待用信息和活跃信息的栏。跃信息的栏。16n待用信息和活跃信息的表示:待用信息和活跃信息的表示:1 (x,x)表示变量的待用信息和活跃信息。其中表示变量的待用信息和活跃信息。其中i表示待用表示待用信息,信息,y表示活跃,表示活跃,表示非待用和非活跃;表示非待用和非活跃;2 在符号表中,在符号表中,(x,x)(x,
11、x)表示后面的符号对代替前表示后面的符号对代替前面的符号对;面的符号对;3 不特别说明,所有说明变量在基本块出口之后均为非不特别说明,所有说明变量在基本块出口之后均为非活跃变量。活跃变量。17n计算待用信息和活跃信息的算法步骤:计算待用信息和活跃信息的算法步骤:1. 开始时,把基本块中各变量的符号表登记项中的待用开始时,把基本块中各变量的符号表登记项中的待用信息栏填为信息栏填为“非待用非待用”,并根据该变量在基本块出口,并根据该变量在基本块出口之后是不是活跃的,把其中的活跃信息栏填为之后是不是活跃的,把其中的活跃信息栏填为“活跃活跃”或或“非活跃非活跃”;182. 从基本块出口到基本块入口从基
12、本块出口到基本块入口由后向前由后向前依次处理各个四元依次处理各个四元式。对每一个四元式式。对每一个四元式i: A:=B op C,依次执行下面的步,依次执行下面的步骤:骤: 1) 把符号表中变量把符号表中变量A的待用信息和活跃信息附加到的待用信息和活跃信息附加到四元式四元式i上;上; 2) 把符号表中把符号表中A的待用信息和活跃信息分别置为的待用信息和活跃信息分别置为“非待用非待用”和和“非活跃非活跃”; 3) 把符号表中变量把符号表中变量B和和C的待用信息和活跃信息附加的待用信息和活跃信息附加到四元式到四元式i上;上; 4) 把符号表中把符号表中B和和C的待用信息均置为的待用信息均置为i,活
13、跃信息,活跃信息均置为均置为“活跃活跃”。19:基本块:基本块1.T:=A-B2.U:=A-C3.V:=T+U4.W:=V+U设设W是基本块出口之后的活跃变量。是基本块出口之后的活跃变量。建立待用信息链表与活跃变量信息链表如下:建立待用信息链表与活跃变量信息链表如下:20(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)(,) 序号序号 四元式四元式 左值左值 左操作数左操作数 右操作数右操作数变量名变量名初始状态初始状态信息链信息链(待用待用/活跃信息栏活跃信息栏) (3,y) (
14、,) (2,y) (1,y) (1,y) (2,y) (4,y) (,) (3,y)T(,)A(,)B(,)C(,)U(,)V(,)W (,y) (,) (4,y) (,)21为了在代码生成中进行寄存器分配,要随时掌握各寄存为了在代码生成中进行寄存器分配,要随时掌握各寄存器的情况:空闲?已分配给某个器的情况:空闲?已分配给某个(几个几个)变量?变量?n寄存器描述数组寄存器描述数组RVALUE动态记录各寄存器的使用信息动态记录各寄存器的使用信息RVALUER=A,B每当指令要引用某变量时,如果该变量的现行值已在某每当指令要引用某变量时,如果该变量的现行值已在某寄存器中,可直接使用寄存器,而不必访
15、存。寄存器中,可直接使用寄存器,而不必访存。n变量地址描述数组变量地址描述数组AVALUE动态记录各变量现行值的存放位置动态记录各变量现行值的存放位置AVALUEA=R1, R2, A22n补充说明:补充说明:因为寄存器的分配是局限于基本块范围之内的,一旦因为寄存器的分配是局限于基本块范围之内的,一旦处理完基本块中所有四元式,对现行值在寄存器中的处理完基本块中所有四元式,对现行值在寄存器中的每个变量,如果它在基本块之后是活跃的,则要把它每个变量,如果它在基本块之后是活跃的,则要把它存在寄存器中的值存放到它的主存单元中。存在寄存器中的值存放到它的主存单元中。要特别强调的是,对形如:要特别强调的是
16、,对形如:A:=B的四元式,如果的四元式,如果B的的现行值在某寄存器现行值在某寄存器Ri中,则无须生成目标代码,只须中,则无须生成目标代码,只须在在RVALUE(Ri)中增加一个中增加一个A,(即把即把Ri同时分配给同时分配给B和和A),并把,并把AVALUE(A)改为改为Ri 。23n代码生成算法:代码生成算法:对每个四元式对每个四元式: i: A:=B op C,依次执行:,依次执行: 1. 以四元式以四元式: i: A:=B op C 为参数,为参数,调用函数过程调用函数过程GETREG(i: A:=B op C),返回一个寄存器返回一个寄存器R,用作存,用作存放放A的寄存器。的寄存器。
17、 2. 利用利用AVALUEB和和AVALUEC,确定,确定B和和C现行值的现行值的存放位置存放位置B和和C。如果其现行值在寄存器中,则把寄存。如果其现行值在寄存器中,则把寄存器取作器取作B和和C 3. 如果如果BR,则生成目标代码:,则生成目标代码: LD R, B op R, C 否则生成目标代码否则生成目标代码 op R, C 如果如果B或或C为为R,则删除,则删除AVALUEB或或AVALUEC中的中的R。24 4. 令令AVALUEA=R, RVALUER=A。 5. 若若B或或C的现行值在基本块中不再被引用,也不是基本块的现行值在基本块中不再被引用,也不是基本块出口之后的活跃变量,
18、且其现行值在某寄存器出口之后的活跃变量,且其现行值在某寄存器Rk中,则删中,则删除除RVALUERk中的中的B或或C以及以及AVALUEB或或AVALUEC 中的中的Rk ,使得该寄存器不再为,使得该寄存器不再为B或或C占用。占用。25n寄存器分配:寄存器分配:GETREG(i: A:=B op C) 返回一个用来存放返回一个用来存放A的值的寄存器的值的寄存器1 如果如果B的现行值在某个寄存器的现行值在某个寄存器Ri中,中,RVALUERi中只中只包含包含B,此外,或者,此外,或者B与与A是同一个标识符是同一个标识符,或者,或者B的的现行值在执行四元式现行值在执行四元式A:=B op C之后不
19、会再引用之后不会再引用,则,则选取选取Ri为所需要的寄存器为所需要的寄存器R,并转,并转4;2 如果有尚未分配的寄存器,则从中选取一个如果有尚未分配的寄存器,则从中选取一个Ri为所需为所需要的寄存器要的寄存器R,并转,并转4;1 尽可能用尽可能用B独占的寄存器独占的寄存器2 尽可能用空闲寄存器尽可能用空闲寄存器3 抢占用非空闲寄存器抢占用非空闲寄存器263 从已分配的寄存器中选取一个从已分配的寄存器中选取一个Ri为所需要的寄存器为所需要的寄存器R。最好使得最好使得Ri满足以下条件:满足以下条件: 占用占用Ri的变量的值也同时存放在该变量的贮存单元中,的变量的值也同时存放在该变量的贮存单元中,或者在基本块中要在最远的将来才会引用到或不会引或者在基本块中要在最远的将来才会引用到或不会引用到。用到。要不要为要不要为Ri中的变量生成存数指令?中的变量生成存数指令?1 尽可能用尽可能用B独占的寄存器独占的寄存器2 尽可能用空闲寄存器尽可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论