编译原理 代码生成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)在块出口处,将所有活跃名字值刷新到
3、相应存储单元。,简单代码生成器(续),函数getReg(p:x := y 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 b u := a + c v := t + u w:= v +
4、 u 可用寄存器R0,R1 初始,名字a、b和c的值均在相应存储单元中,TAC 目标代码 REG NAME t:=a-b mov a, R0 sub b, R0 R0含t t在R0 u:=a+c mov a, R1 R0含t t在R0 add c, R1 R1含u u在R1 v:=t+u add R1, R0 R0含v v在R0 R1含u u在R1 w:=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
5、 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在栈中偏移,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 $ 立
6、即数前缀,如 , $100(十进制), $0x99(十六进制) 后缀 l , w , b 操作数大小,对应 long, word 和 byte, 如, movl %ebx, %ecx movb %bl, %al,内存寻址方式,section : disp ( base, index, scale ) 计算方式如下: base + index * scale + disp section/disp/index/scale(包括base) 均可缺省。section用于实模式下。如, addl (%ebx,%ecx,0x2), %edx (%ebx+%ecx*0x2)+%edx %edx subl
7、0x20( %eax,%ecx,0x4), %ebx %ebx - (%eax+%ecx*0x4+0x20) %ebx,内存寻址方式,leal (%ebx, %ecx) , %eax %ebx + %ecx %eax 这里scale缺省为1。scale 和 disp 中的立即数不加前缀$。,常用汇编指令,addl , subl , movl , sall pushl , popl , leave , ret leal , nop , incl jmp , jle 等条件转移指令,C语句 i = i * 10 对应汇编码,movl -4(%ebp),%edx / 取变量i的值到寄存器%edx m
8、ovl %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 = 0; /printf(“%ldn“, (i=i+1)+(i=i+1)+(i=i+1); case 1 /printf(“%ldn“, (+i)+(+i)+(+i
9、); 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(%ebp),%edx incl %edx movl %edx,%ecx movl %ecx,-4(%ebp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 代码生成2 编译 原理 代码 生成
链接地址:https://www.31doc.com/p-3734704.html