课程《编译原理》课件第12章-代码生成.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《课程《编译原理》课件第12章-代码生成.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 课程 编译 原理 课件 12 代码 生成
- 资源描述:
-
1、2021/7/2312021/7/23212.1 12.1 目标机目标机目标代码分为两类:一是机器语言代码 一是汇编语言代码一、有代表性的目标机二、具体指令系统(R)addrA(addrA)R ST R,A LD R,A 存取 意义 R,A 种类 2021/7/233(R)(addr(A)RIADD R,A ISUB R,A IMUL R,A整数运算(R)(addr(A)RAND R,A OR R,A 逻辑运算(R)(addr(A)R ADD R,ASUB R,AMUL R,A DIV R,A 实数运算2021/7/234Real(addrA)R CONV R,A 转实(R)=true则转ad
2、drA,否则下一条(R)=false则转addrA,否则下一 条 无 条 件 转 向addrA TJMP R,A FJMP R,A JMP R,A 转向操作(R)(addrA)成立,则trueR,否则falseR LT R,ALE R,AEQ R,A GT R,AGE R,A 关系运算 2021/7/235AddrAR LDA R,A 读出地址(R)+M MR R RINC R,M 变址器加 例子:假设有函数说明FUNCTION f(VAR X:real;J:integer):real;BEGIN X:=2.5+J IF X2.5 THEN X:=X+1 ELSE X:=X-1.0;f:=X*
3、YEND 2021/7/236则生成的四元式为(当前层数l-1):1.(FUNC,f,Noff,Moff)2.(CONV,J,T1)3.(r+,2.5,T1,T2)2.5+J 4.(=:,T2,X)X:=2.5+J 5.(,X,2.5,T3)X2.5 4.(THEN,T3,)5.(CONV,1,T4)6.(r+,X,T4,T5)X+1 7.(=:,T5,X)X:=X+1 8.(ELSE,)2021/7/237 9.(r-,X,1.0,T6)X-1.0 10.(=:,T6,X)X:=X-1.0 11.(IFEND,)12.(r*,X,Y,T7)X*Y 13.(=:,T7,f)f:=X*Y 14.
4、(FUNED,)引用型形参变量是间接变量,因此要用间接地址法.从上面中间代码生成出来的目标代码如下:1.ST ,2top 存返回地址2021/7/238 2.JMP ,DISPLAY 形成DISPLAY表 3.-l,l (top)sp 4.ST top,sp (top)+Moftop 5.RINC top,Moff 6.CONV R1,J 7.ADD R1,2.5 8.ST R1,*X 9.LD R1,*x10.GT R1,2.511.FJMP R1,12.CONV R1,113.ADD R1,*x2021/7/23914.ST R1,*x15.JMP ,16.LD R1,*X17.SUB R
5、1,1.018.ST R1,*x19.LD R1,*X20.MUL R1,y21.ST R1,3sp22.ST SP,top (sp)top23.LD SP,0top (0top)sp24.JMP ,2top 返回 2021/7/2310 在本例中,标示符的抽象地址和目标地址如下:(i,ksp)(l,i)y5sp(l,5)J4sp(l,4)X3sp(l,3)f目标地址 抽象地址 标示符 其中k=6+l 2021/7/2311 指令2转向子程序DISPLAY。它把指令3作为信息做下面工作(造本层DISPLAY表)并返回到指令4:1.0 i 2.(addr(i,2top)(i+6)top 3.i+
6、1i 4.若il则转2 5.(sp)(6+l)top 2021/7/231212.2 12.2 寄存器分配寄存器分配定义访问一次内存的代价为,则指令执行代价=访问内存次数+1 例如:1.DL R0,M MUL R0,R0 总代价=4 ADD R0,R0 2.DL R0,M ADD R0,M 总代价=6 ST R0,M2021/7/2313 3.DL R0,M MUL R0,R1 总代价=7 ST R0,M其中M表示直接存储地址。2021/7/2314使用寄存器的主要思想使用寄存器的主要思想 在目标代码中使用寄存器的主要思想是:在四元式中,每当一个变量被定义时,首先产生把值送入某一寄存器的目标代
7、码,然后在一个表里注明该变量的值在哪一寄存器中,只有当寄存器被剥夺且变量的值以后还有用时,才把寄存器中的现行值记入内存单元。当一个变量的值以后不再被引用时,就不必保存到内存中。2021/7/2315 寄存器的分配以基本块为单位。在基本块开始时所有寄存器都是空闲可用的,在结束基本块时剥夺所有寄存器,以便在下一个基本块开始时所有寄存器都是可用的。2021/7/2316 寄存器分配的中心问题有二:一是寄存器的主动释放问题,一是寄存器的剥夺(被迫释放)问题。当没有可主动释放的,又没有空闲可用的寄存器时要采取剥夺手段。两个中心问题中的主要问题是寄存器的剥夺问题。决定剥夺哪个寄存器的主要因素有下列一些:1
8、写入内存次数。2下次使用点的距离。3使用频率。2021/7/2317 每当一个寄存器被剥夺时,要把它的值写入一些内存单元中,我们希望这种写入动作最少。不同寄存器中的值在一个基本块内的使用频率是不相同的,我们希望被剥夺者(值)的使用频率是最低的。我们也希望被剥夺者的下次使用点是最远的。2021/7/231812.3 12.3 表达式四元式的翻译表达式四元式的翻译 例例 设有表达式 X*(a+b)*Y*(a+b)其中X和Y为间接量,a和b为直接量,且类型均为实型,则生成的四元式为:1(r+,a,b,T1)2(r*,X,T1,T2)3(r*,T2,Y,T3)4(r*,T3,T1,T4)2021/7/
9、2319由上述四元式生成目标代码的过程如图所示 四 元 式 目 标 代 码 REGALLOC表 r+,a,b,T1 LD R1,a ADD R1,b 1(T1,R1,0,2,2)r*,X,T1,T2 LD R2,*X MUL R2,R1 1(T1,R1,0,4,1)2(T2,R2,0,3,1)r*,T2,Y,T3 MUL R2,*Y 1(T1,R1,0,4,1)2(T3,R2,0,4,1)r*,T3,T1,T4 MUL R2,R1 1(T4,R2,0,-,-)2021/7/232012.4 12.4 复合变量四元式的翻译复合变量四元式的翻译 复合变量有两种:VE,V.I。其中V有两 种可能:第
展开阅读全文