编译原理:第九章目标代码生成(1)_第1页
编译原理:第九章目标代码生成(1)_第2页
编译原理:第九章目标代码生成(1)_第3页
编译原理:第九章目标代码生成(1)_第4页
编译原理:第九章目标代码生成(1)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、 目标生成是编译的最后一个阶段,其功能可表示如下:第 9 章 目标代码及其生成目标生成中间代码目标代码符号表其中:中间代码 - 逆波兰式,三元式,四元式,语义树;目标代码 - 机器语言,汇编语言,符 号 表 - 变量的语义词典,9.1 目标代码生成的基本问题9.2 四元式的目标代码生成算法内容提要9.3 一个简单代码生成器设计9.1 目标代码生成的基本问题9.1.1 目标代码选择 虚拟机及其指令系统: 大多数编译程序不产生绝对地址的机器代码,而是以汇编语言程序作为输出使代码生成阶段变得容易。此外,指令集的选择以及指令的执行速度问题都是重要因素。为了使算法具有通用性,这里采用的是: 虚拟机寄存器

2、 R0 , R1 , , Rn-1 虚拟机指令系统 指令的基本形式:op Ri , Rk/M操作码变量的内存地址含义:Ri:= (Ri)op(Rk)Ri:= (Ri)op(M)或【注】若 op 为单目运算,则op Ri , Rk/M含义是:Ri:= op(Rk/M) 常用的指令:LD Ri,Rk/M Ri:= (Rk/M)ST Ri,Rk/M Rk/M:=(Ri)FJ Ri, M 若 (Ri)=false 则转 MTJ Ri, M 若 (Ri)=true 则转 MJMP _, M 无条件转 MADD Ri,Rk/M Ri:=(Ri)+(Rk/M)SUB Ri,Rk/M Ri:=(Ri)-(Rk

3、/M)MUL Ri,Rk/M Ri:=(Ri)*(Rk/M)DIV Ri,Rk/M Ri:=(Ri)/(Rk/M)此外还有下述 操作码 op :LT(),EQ(=),LE(=),NE(!=)AND(&),OR(|),NO(!)取、存转 向算术运算逻辑运算 四元式目标代码翻译示例:【例9.1】( + a b t1 )( - t1 d t2 )SUB R0,dLD R0,a ADD R0,b【例9.2】( + a b t1 )( - c d t2 )LD R1,cLD R0,a ADD R0,b( * t1 t2 t3 )SUB R1,dMUL R0,R1讨论 为了精简代码,四元式结果变量值并不急

4、于存储! 例9.1中的t1的值,系统如何知道是在寄存器R0中? 例9.2存在寄存器分配问题,显然,若t2仍然占用寄存器R0,则t1值将丢掉!9.1.2 变量的活跃信息. 变量的定义点和应用点 设有四元式:q( B C A )B,C的应用点(q)A的定义点(q). 活跃变量与非活跃变量【活跃变量】一个变量从某时刻(q)起,到下一个定义点止,其间若有应用点,则称该变量在q是活跃的(y),否则称该变量在q是非活跃的(n)。 【注】我们是在一个基本块内讨论变量的活跃信息的,为了处理方便,假定: 临时变量在基本块出口后是非活跃的(n); 非临时变量在基本块出口后是活跃的(y); 【例9.3】求下述基本块

5、内变量的活跃信息:x=(a+b)/(a*(a+b);i=a+b;【解】令 A(l)中的 l 为变量A 在某点的活跃信息(y/n);则有四元式序列:(+ a b t1 )(* a t1 t3 )(/ t1 t3 x )(= t1 _ i )(+ a b t1 )(+ a b t2 )(* a t2 t3 )(/ t1 t3 t4 )(= t4 _ x )(+ a b t5 )(= t5 _ i )优化后(+ a( ) b( ) t1( ) )(* a( ) t1( ) t3( ) )(/ t1( ) t3( ) x( ) )(= t1( ) _ i( ) ) 附有活跃信息的四元式:yyyyyyy

6、yynn. 基本块内活跃信息求解算法 支持: 在符号表上增设一个信息项( L ) Lname活跃信息 四元式中变量 X 的附加信息项:X( L ) 取值: L=n/y(不活跃/活跃) ; 初值:基本块内各变量 SYMBLX( L )分别填写:若 X为非临时变量 则置 X( y ); 否则置 X( n ) 逆序扫描基本块内各四元式(设为 q:( B C A) ):执行: QTq:A( L ):= SYMBLA( L ); SYMBLA( L ):=( n ); QTq:B,C( L ):= SYMBLB,C( L ); SYMBLB,C( L ):=( y ); 算法 活跃信息生成过程示例: 【

7、例9.4】基本块内下述四元式序列如下:QTq: q:( B( L ) C( L ) A( L )(+ a( ) b( ) t1( )(- c( ) d( ) t2( )(* t1( )t2( )t3( )(- a( ) t3( )t4( )(/ t1( ) 2 t5( ) (+ t4( )t5( ) x( ) y n n y n y y n y y n y y y y y yL abcdt1t2xt5t4t3SYMBLX( L )yyyynnynnnnyynynyynyynyynyy9.1.3 寄存器的分配问题 寄存器操作快且指令短,如何充分利用它? 寄存器分配三原则:【主动释放】如果B已经在

8、寄存器Ri中,则选择Ri: 若 B 活跃,则要保存B的值,方法是:若有空闲寄存器Rj,则生成指令 ST Ri,Rj;否则生成指令 ST Ri,B; 修改描述表:删除 B,填写 A。【选空闲者】从空闲寄存器中选一 Ri;并把 A 填入描述表:。 【强迫释放】剥夺一 Ri: 处理办法同规则 。 设置描述表: RDL(R0,R1, Rn):即指明 当前变量 x 值在寄存器R1中!如何为A分配寄存器?若可交换,则C也可! 用以记录寄存器的当前状态:如 RDL.R1=x设当前四元式: q: A = B C支持: 寄存器分配原则;活跃变量概念。 寄存器分配过程示例: 【例9.5】 设有三个寄存器:R0,R

9、1,R2 OBJp QTqR0R1RDLR2(+ a(y) b(y) t1(y)(- c(y) d(y) t2(y)(* t1(y)t2(n)x(y)(/ a(n) x(n) x(y)(= x(y) _ a(y)(= a(y) _ y(n)(- x(y)t1(n) y(y) LD R1,c SUB R1,dt1LD R0,a ADD R0,bt2ST R0,R2LD R1,axLD R1,aySUB R1,t111MUL R0,R1yxaDIV R1,R0ST R1,R0ST R0,R212【注】 一个变量在同一时刻只能占有一个寄存器! 基本块出口时,寄存器中的活跃变量应保存其值。t1t2xy

10、xya红色变量为预分配!t1xx9.1.4 目标代码生成问题 目标代码生成是以基本块为单位的,在生成目标代码时要注意如下三个问题: 基本块开始时所有寄存器应是空闲的;结束基本快时应释放所占用的寄存器。 一个变量被定值(被赋值)时,要分配一个寄存器 Ri保留其值,并且要填写相应的 描述表 RDL.Ri。 为了生成高效的目标代码,生成算法中要引用寄存器分配三原则和变量的活跃信息。QTq 四元式区;OBJp 目标区;环境设置RDL(R0,R1, Rn) 寄存器状态描述表;SEM(m) 语义栈(用于信息暂存);【例9.6】单寄存器下表达式目标代码生成:R 寄存器;RDL 描述表;SEM 语义栈。设 O

11、BJp QTqBSEMRDL(+ a(y) b(y) t1(y)(- c(y) d(y) t2(y)(* t1(y)t2(n)t3(y)(- a(y) t3(n)t4(y)(/ t1(n) 2 t5(y)(+ t4(n)t5(n) x(y)ST R,t1 LD R,ct1LD R,a ADD R,bt2SUB R,dMUL R,t1t3ST R,t3 LD R,aSUB R,t3t4ST R,t4 LD R,t11112DIV R,2t513ADD R,t4xt1t2t3t4t5x红色变量为预分配!【例9.7】单寄存器下如:if(ab)x=(a+b)*c; ( a(y) b(y) t1(y)(

12、if t1(n) _ _ )(+ a(y) b(y) t2(y)(* t2(n) c(y) x(y)(el _ _ _ )(* a(y) b(y) t3(y)(- 5 t3(n) x(y)(ie _ _ _ )FJ R,?LD R,aLD R,aMUL R,cJMP_,? ST R,t31213SUB R,t314ST R,x1515ST R,x11GT R,belse x=5-a*b;LD R,5条件语句目标代码生成:人工翻译过程ADD R,bMUL R,bLD R,a待返填1待返填2返填时机1返填时机2(接上页)如:if(ab)x=(a+b)*c;else x=5-a*b; OBJp QU

13、ATqBSEMRDL( a(y) b(y) t1(y)(if t1(y) _ _ )(+ a(y) b(y) t2(y)(* t2(n) c(y) x(y)(el _ _ _ )(* a(y) b(y) t3(y)(- 5 t3(y) x(y)(ie _ _ _ )FJ R,?t1LD R,at2LD R,a ADD R,bMUL R,cxJMP_,? LD R,a MUL R,bt3 ST R,t3 LD R,51213SUB R,t3x14ST R,x1515ST R,x11GT R,bt1t2xt3xSEM栈用于保存待返填地址!计算机的目标代码生成过程: 单寄存器下目标代码生成要点: 表达式四元式 q:( B C A ) 为 A 预分配寄存器,并在 RDL表中登记! 赋值四元式 q:( = B _ A ) 为 A 预分配寄存器,然后编赋值指令 ! 转向四元式 q:( go B _ _ ), 先释放寄存器,后编转向指令,保存该地址于SEM栈中! 【释放寄存器】编存储指令,保存占有寄存器的活跃变量值;通常发生在如下两个时刻:目标代码生成是以单个四元式为单位进行的!注 为结果变量申请寄存器时

温馨提示

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

评论

0/150

提交评论