- 1、本文档共38页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
代码生成 代码生成 代码生成的输入 -各种中间代码形式 目标代码与目标机器模型 简单的代码生成器 基本块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 简单代码生成器 寄存器描述 记录寄存器的使用情况,即某寄存器中存放的是哪(些)个名字(变量)的值。 名字地址描述 名字(变量)的当前值的存放场所,如放在寄存器或主存(数据区)或者栈里等。 简单代码生成器(续) 代码生成算法 对基本块中三地址代码,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 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 + u 可用寄存器R0,R1 初始,名字a、b和c的值均在相应存储单元中 e.g.1 简单代码生成 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 其它语句的代码生成 语句 i 在Ri i 在Mi i 在栈中 a := b[i] mov b(Ri),R mov Mi,R mov Si(bp),R mov b(R),R mov b(R),R a[i] := 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 y goto z : y – x ? R 判别R非负(实施转移) - 根据条件码转移 如 if x y goto z : cmp x, y jg z // 若y
文档评论(0)