第九章 目标等代码生成.pptVIP

  • 0
  • 0
  • 约2.28千字
  • 约 19页
  • 2019-03-09 发布于福建
  • 举报
第九章 目标等代码生成

第九章 目标代码生成 * * 源程序 编译 前端 代码 生成 符号表 代码 优化 目标程序 中间代码 中间代码   对代码生成器的要求是严格的,它输出的代码必须正确而且质量高 。               质量高的含义是它应该有效地利用机器的资源, 此外,代码生成器本生也应该高效地运行. 代码生成的输入:中间代码和符号表 目标代码的形式: 机器语言代码 机器语言模块 汇编语言代码 目标代码生成重点要考虑的问题: 生成的目标代码较短 充分利用寄存器,减少存储单元访问次数 9.1基本问题 一.代码生成器的输入 已确定的中间代码形式 所有信息已填入符号表 name type kind val addr a int var ? O b Real var ? 2 c real var ? 6 ? int const 100 ? d int var ? 8 用于产生数据对象的运行时地址 二.目标程序 绝对机器代码:所有地址均已定位, 可立即执行 可再定位机器代码:允许子程序单独 编译    汇编语言:使代码生成变得容易       三.指令选择   丰富的机器指令会使生成的目标代码质量更、高、速度更快           例:I=I+1 用inc I 实现比用 LD R0 I, ADD R0 #1  ST R0 I 生成的代码质量高 四、存贮管理 把源程序中的名字映射成运行时数据对象的地址是由前端的代码生成器共同完成的 PROCEDURE sub(x,y:real); VAR i ,j:integer; a:ARRAY[1..5] OF real; e, f : real; BEGIN ? f :=e+i*j; ? END; f 符号表 名字 形 类型 偏移量 活动记录布局=  老SP (sp,0) x 形 real 3 返回地址 (sp,1) y 形 real 4 2 (sp,2) (sp,3) (sp,5) i int 5 i (sp,9) j int 9 j (sp,13) a ?array 13 a (sp,53) e e real 53 (sp,61) f real 61 (sp,4) x y t1 t2 t3 (sp,62) (sp,63) (sp,64) 中间代码 * i j t1 * (sp ,5) (sp ,9) (sp ,62) + e t1 t2 + (sp ,53) (sp ,62) (sp ,63) itor t2 – t3 itor (sp ,63) – (sp ,64) := t3 – f := (sp ,64) – (sp ,61) 五、寄存器的分配 操作数在寄存器中的指令通常要比操作数在内存中的指令短一些,执行也要快一些 充分利用寄存器对生成好的代码尤其重要。 1、选择要驻留在寄存器中的变量 2、选出分配给驻留在寄存器中的变量的寄存器 需要考虑的问题: 寄存器的分配原则: 1. 选择已被变量占用,但变量以后可能不被引用的寄存器 2.已分配寄存器,且存放的变量在较远的结点才被引用 3.分配空闲的寄存器 使用专用寄存器 六、计算次序的选择 七、代码生成方法 计算执行的次序会影响目标代码

文档评论(0)

1亿VIP精品文档

相关文档