编译原理 代码生成2.ppt
《编译原理 代码生成2.ppt》由会员分享,可在线阅读,更多相关《编译原理 代码生成2.ppt(38页珍藏版)》请在三一办公上搜索。
1、代码生成,代码生成,代码生成的输入各种中间代码形式目标代码与目标机器模型简单的代码生成器基本块DAG图及代码生成,目标代码,绝对地址目标代码可重定位的目标 linker/loader汇编代码 assembler,目标机器模型,指令形式op 源,目的寻址模式 绝对地址:op M,R R op(M)R 寄存器:op R1,R2 R2 op R1 R2 变址:op R1,c(R2)(c+R2)op R1(c+R2)间接变址、间接寄存器 直接量 op$C,R R+C R,简单代码生成器,寄存器描述记录寄存器的使用情况,即某寄存器中存放的是哪(些)个名字(变量)的值。名字地址描述名字(变量)的当前值的存
2、放场所,如放在寄存器或主存(数据区)或者栈里等。,简单代码生成器(续),代码生成算法对基本块中三地址代码,p:x:=y op z,1)调用函数getReg(),返回存放计算结果的场所L(一般为寄存器R,也可能是存储单元);2)若y的值不在L中,产生指令:mov y,L(查y的名字地址描述获得y值的存放场所y);3)产生指令:op z,L(z是z值的存放场所),修改x的名字描述和相关寄存器描述;4)若y和/或z在p之后不再引用、出口不活跃且其值在寄存器中,则修改其相应寄存器和名字地址描述;5)在块出口处,将所有活跃名字值刷新到相应存储单元。,简单代码生成器(续),函数getReg(p:x:=y
3、op z):返回计算结果存放场所L,1)若某寄存器R仅含y的值且p后不再引用和不活跃,则返回R;(好处是可以省掉装载y值的指令mov y,L)2)返回某个空闲寄存器R;3)若x必须使用寄存器,则此时“抢占”某个寄存器R。查看R的描述,如果名字a的值在R中则产生转储指令mov R,Ma(Ma:a的存储单元),并修改相应的描述;(关键是如何抢占及剥夺哪些名字的寄存器使用权)4)使用x的存储单元,e.g.1 简单代码生成,三地址码序列:t:=a bu:=a+cv:=t+uw:=v+u可用寄存器R0,R1初始,名字a、b和c的值均在相应存储单元中,TAC目标代码REG NAMEt:=a-bmov a,
4、R0sub b,R0 R0含t t在R0u:=a+c mov a,R1 R0含t t在R0 add c,R1 R1含u u在R1v:=t+u add R1,R0 R0含v v在R0R1含u u在R1w:=v+u add R1,R0 R0含w w在R0,e.g.1 简单代码生成,其它语句的代码生成语句 i 在Ri i 在Mi i 在栈中 a:=bi mov b(Ri),R mov Mi,R mov Si(bp),R mov b(R),R mov b(R),R ai:=b mov b,a(Ri)mov Mi,R mov Si(bp),R mov b,a(R)mov b,a(R)Si是i在栈中偏移,
5、bp是当前活动记录基址。指针操作语句:a:=*b*a:=b,转移语句goto X JMP X if x op y goto z 根据寄存器内容是否满足以下条件:负、零、正、非负、非零、非正 如 if x x则转z,AT&T汇编简介,语法,INSTR Source,Dest e.g.movl(%ecx),%eax addl$1,%edx,前缀与后缀,%寄存器前缀,如%eax,%ebp$立即数前缀,如,$100(十进制),$0 x99(十六进制)后缀 l,w,b 操作数大小,对应 long,word 和 byte,如,movl%ebx,%ecxmovb%bl,%al,内存寻址方式,section:
6、disp(base,index,scale)计算方式如下:base+index*scale+disp section/disp/index/scale(包括base)均可缺省。section用于实模式下。如,addl(%ebx,%ecx,0 x2),%edx(%ebx+%ecx*0 x2)+%edx%edxsubl 0 x20(%eax,%ecx,0 x4),%ebx%ebx-(%eax+%ecx*0 x4+0 x20)%ebx,内存寻址方式,leal(%ebx,%ecx),%eax%ebx+%ecx%eax 这里scale缺省为1。scale 和 disp 中的立即数不加前缀$。,常用汇编指
7、令,addl,subl,movl,sall pushl,popl,leave,retleal,nop,incljmp,jle 等条件转移指令,C语句 i=i*10 对应汇编码,movl-4(%ebp),%edx/取变量i的值到寄存器%edx movl%edx,%eax sall$2,%eax/左移寄存器%eax 2位,%eax=4*i addl%edx,%eax/%eax=5*i leal 0(,%eax,2),%edx/%eax*2%edx,%edx=10*i/为何不用 sall$1,%eax movl%edx,-4(%ebp)/10*i i,e.g.2+问题,main()long i;i=
8、0;/printf(%ldn,(i=i+1)+(i=i+1)+(i=i+1);case 1/printf(%ldn,(+i)+(+i)+(+i);case 2/printf(%ldn,(i+)+(i+)+(i+);case 3 return 0;,case 1 case 2 case 3,movl$0,-4(%ebp)movl-4(%ebp),%edx incl%edx movl%edx,%eax movl%eax,-4(%ebp)movl-4(%ebp),%edx incl%edx movl%edx,%ecx movl%ecx,-4(%ebp)addl%ecx,%eax movl-4(%eb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 代码生成2 编译 原理 代码 生成
链接地址:https://www.31ppt.com/p-4526565.html