编译原理第三版 第十一章 代码生成.pptVIP

  • 9
  • 0
  • 约4.26千字
  • 约 17页
  • 2018-04-13 发布于湖北
  • 举报
编译原理第三版 第十一章 代码生成

* * * 第十一章 目标代码生成 本章要点 任务:将优化后的中间代码变换为目标代码 目标代码生成器的设计标准 产生正确代码 易于实现、测试及维护等。 一般问题 简单的代码生成器 寄存器分配 11.1 一般问题 代码生成器的输入:源程序中间代码、符号表信息 代码生成器输出(目标代码形式): 可执行的机器语言代码(绝对机器代码) 待装配的机器语言模块 汇编语言代码 指令的选择 指令集的一致性、完全性、指令速度等。 寄存器分配 在程序某点上哪些量驻留寄存器 驻留寄存器的量驻进哪些寄存器 计算顺序 有些计算顺序要求存放中间结果的寄存器的数 量少。 11.2 一个计算机模型 指令类型 直接地址型:op Ri, M 寄存器型: op Ri, Rj 变址型: op Ri, c(Rj) 间接型: op Ri, * M op Ri, *Rj op Ri, *c(Rj) 运算符:LD、ST、ADD、SUB、MUL、DIV等 例:LD R0,B ST D,R1 11.3 简单代码生成器 功能: 依次把中间代码转换为目标代码。 在基本块范围内充分利用寄存器。 指令类型: 直接地址型: op Ri, M 寄存器型: op Ri, Rj 变址型: op Ri, c ( Rj ) 间接访问型: op Ri, *M op Ri, *Rj op Ri, *c (Rj ) 原则: 生成目标代码时尽量引用寄存器中的值,少访问内存。 已在寄存器中的值尽量保存,直至必须释放为止。 一般地,不考虑效率时, 形如X:=Y+Z的中间代 码,可翻译为: LD R,Y ADD R,Z ST R,X 例:高级语言语句:A:=(B+C)*D+E 中间代码:(1)T1:=B+C (2)T2:=T1*D (3)T3:=T2+E 目标代码:(1)LD R,B (2)ADD R,C (3)ST R,T1 (4)LD R,T1 (5)MUL R,D (6)ST R,T2 (7)LD R,T2 (8)ADD R,E (9)ST R,A 1. 待用信息与活跃信息 确定变量何处引用、是否引用 (1) 待用信息: 在基本块中,若 i 点对A定值, j点引用A,且 i 至 j 未对A再定值 则称j是i 关于A的待用信息 (2) 活跃信息: 若A在p点的值在基本块内或 基本块的后继块中还要引用 则称A在p点活跃 . . . (i) A:= . . . . . . (j) . . . :=. . . A. . . . . . (3) 计算待用信息和活跃信息算法 序号 四元式 左部 左操作数右操作数 名字 . . . 待用信息 活跃信息 四 元 式 表 符 号 表 算法步骤: 1. 初始化: 基本块中各变量的待用信息栏置: 非待用 ( ^ ) 活跃信息栏置 :非活跃(^) 或 活跃 (Y) 2. 从基本块的出口至入口处理各个四元式 (i) A:=B op C 把符号表中A的待用-活跃信息附加到四元式 i 的左部 把符号表中A的待用-活跃信息置为 ( ^, ^ ) 把符号表中B和C的待用 - 活跃信息附加到i的左右操作数 把符号表中B和C的待用 - 活跃信息置为 ( i , Y ) 3.重复步骤2直到所有中间代码处理完。 [ 例] 考察基本块 (1) T:= A - B (2) U:= A - C (3) V:= T + U (4) W:= V + U W是出口活跃的 符号表中的待用、活跃信息 序号 四元式 左 部 左操作数右操作数 名字 ( 待用信息 , 活跃信息) T ( ^, ^) A ( ^, ^) B ( ^, ^) C ( ^, ^ ) U ( ^, ^) V ( ^, ^ ) W ( ^, Y)

文档评论(0)

1亿VIP精品文档

相关文档