编译原理 代码生成课件.ppt

  1. 1、本文档共106页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 代码生成课件

第九章 代码生成 学习内容 目标机器 存储管理 基本块、流图 简单代码生成算法 寄存器分配 窥孔优化 基本块dag表示、从dag生成代码 9.1 设计中的问题 输入 前端生成的中间表示形式 线性化表示:后缀表示形式 四元式表示:三地址码 虚拟机表示:抽象栈机器代码 图形化表示:语法树、DAG 符号表信息 类型检查、类型转换已完成 输入是无错误的 设计中的问题(续) 目标程序 绝对机器语言 固定内存地址,可直接执行 可重定位机器语言 多模块连接 灵活、分别编译 汇编语言 简单——符号指令、宏的使用 设计中的问题(续) 内存管理 名字?数据地址,与前端协作 符号表 标号?指令地址 backpatching技术 设计中的问题(续) 指令选择 指令集特性 一致性、完整性 指令速度、机器特性 代码质量:速度、大小 丰富的指令集?多种代码生成方式 选择最高效方式 设计问题(续) 寄存器分配 allocation、assignment 最优化assignment——NP-完全问题 register-pair 计算顺序 调整计算顺序?提高效率 NP-完全问题 设计问题(续) 代码生成方法 正确性是第一位的 设计目标:易于实现、测试、维护 9.6节:生成算法,9.9节:窥孔优化 9.7节:寄存器使用算法——控制流 9.10、9.11节:代码选择 9.12节:代码生成——树重构 9.2 目标机器 寄存器:R0,R1,…,Rn-1 指令:op source, destination 寻址方式 MOV R0, M MOV 4(R0), M MOV *4(R0), M 指令开销 长度 MOV R0, R1:开销1 MOV R5, M:开销2 ADD #1, R3:开销2 SUB 4(R0), *12(R1):开销3 指令开销——翻译方法 a = b + c MOV b, R0 开销6 ADD c, R0 MOV R0, a MOV b, a 开销6 ADD c, a MOV *R1, *R0 开销2 ADD *R2, *R0 ADD R2, R1 开销3 MOV R1, a 9.3 运行时存储管理 静态分配,栈分配 翻译如下三地址码 call return halt action 9.3.1 静态分配 call翻译为 MOV #here, callee.static_area GOTO callee.code_area return翻译为 GOTO *callee.static_area 例9.1 例9.1(续) 100: ACTION1 120: MOV #140, 364 132: GOTO 200 140: ACTION2 160: HALT … 200: ACTION3 220: GOTO *364 … /* 300-363: c的活动记录 */ 300: /* 返回地址 */ 304: /* 局部数据 */ … /* 364-451: p的活动记录 */ 364: /* 返回地址 */ 368: /* 局部数据 */ 9.3.2 栈分配 使用相对活动记录起始的偏移 活动记录的地址——栈寄存器,SP “第一个过程” MOV #stackstart, SP 第一个过程的代码 HALT 栈分配——函数调用和返回 调用 ADD #caller.recordsize, SP /* 指向被调函数活 动记录 */ MOV #here + 16, *SP /* 保存返回地址 */ GOTO callee.code_area 返回 GOTO *0(SP) 栈寄存器调整回调用者的活动记录 SUB #caller.recordsize, SP 例9.2 例9.2(续) /* s的代码 */ 100: MOV #600, SP /* 初始化栈 */ 108: ACTION1 128: ADD #ssize, SP /* 调用序列开始 */ 136: MOV #152, *SP /* 返回地址压栈 */ 144: GOTO 300 /* call q */ 152: SUB #ssize, SP /* 恢复栈 */ 160: ACTION2 180: HALT … /* p的代码 */ 200: ACTION3 220: GOTO *0(SP) /* return */ … 例9.2(续) /* q的代码 */ 300: ACTION4 /* 条件转移到456 */ 320: ADD #qsize, SP 328: MOV #344, *SP /* 返回地址压栈 */ 336: GOTO 200

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档