网站大量收购闲置独家精品文档,联系QQ:2885784924

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

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

* * 第12章 代码生成 基本问题 目标机器模型 一个简单的代码生成器 寄存器分配(略) DAG的目标代码(略) 作业 课程目录 * * 代码生成概述 p274 逻辑阶段 编译程序的最后一个阶段 输入和输出 中间代码 等价的目标代码 目标代码的一般形式 绝对机器代码 所有地址均已定位 优点:可立即执行 缺点:不能独立编译各模块,灵活性差 可再定位机器代码 需经连接与装入才可执行 优点:子程序可单独编译 缺点:需经汇编器辅助代码生成 汇编语言代码 优点:目标程序好读、可移植 缺点:需经汇编器辅助代码生成 * * 12.1.1 基本问题 p274 代码生成器的设计环境 要依赖于目标机器、指令系统和操作系统。 输入 源程序的中间表示、符号表中的信息。 目标程序 汇编语言。 指令选择 指令集丰富、选择合适。 寄存器分配 有效合理使用寄存器、提高代码质量。 计算顺序选择 影响代码的有效性。 * * 目标代码生成器的基本设计要求 使所生成的目标代码尽可能的短 能较充分地发挥目标计算机可用资源的效率 例如: 尽可能地使用执行速度快的指令 充分利用计算机的寄存器和变址器,以节省访问内存的时间 章节目录 * * 12.2.1 目标机模型 p278 问题提出 代码生成程序总是针对某一具体的计算机实现的 因此,试图脱离具体的计算机来一般性讨论生成高效的目标代码的全部细节是不合适的,也是不可行的 然而又不可能只局限于某一特定的计算机 折中方案 定义一种假想的计算机模型,具有实际计算机的 共同特征 依此模型为依据,讨论代码生成中的某些主要问题 * * 目标机模型 p278 指令形式(寻址方式) (Ri)—通用寄存器Ri中的内容 (M)—内存单元M中的内容 类 型 指令形式 意义(设op是二目运算符) 直接地址型 op Ri,M (Ri)op(M)?Ri 寄存器型 op Ri,Rj (Ri)op(Rj)?Ri 变址型 op Ri,c(Rj) (Ri)op((Rj)+c)?Ri 间接型 op Ri,*M (Ri)op((M))?Ri op Ri,*Rj (Ri)op((Rj))?Ri op Ri,*c(Rj) (Ri)op(((Rj)+c))?Ri 直接操作数型 op Ri,#X (Ri)op X ?Ri * * 目标机模型 p278 常备指令 arc—源操作数 dst—目的操作数 指令形式 意 义 举 例 LD dst,arc (arc)?dst LD R1,B (B)?R1 LD R1,#1 1?R1 LD R1,*(4(R0))(((R0)+4))?R1 ST arc,dst (arc)?dst ST R1,B (R1)?B ADD dst,arc (dst)+(arc)?dst ADD R1,R0 (R1)+(R0)?R1 SUB dst,arc (dst)-(arc)?dst SUB R1,T1 (R1)-(T1)?R1 MUL dst,arc (dst)*(arc)?dst MUL R1,D (R1)*(D)?R1 DIV dst,arc (dst)/(arc)?dst DIV R1,A (R1)/(A)?R1 章节目录 * * 执行代价 衡量目标程序工作效率的指标 目标程序的长短 目标程序的执行时间——取决于访问内存的次数 一条指令执行代价 定义:执行该指令所需访问内存的总次数 值=该指令访问内存的次数+1(取指令访问一次内存) 目标程序的执行代价 定义:各条指令执行代价总和 特点:该值越低目标程序的执行效率越高 产生目标代码时,应尽可能选用执行代价较小的指令 * * 执行代价举例 指令 执行代价 LD R0,R1 (0+1) 1 LD R1,M (1+1) 2 ST R1,T1 (1+1) 2 ADD R1,#1 (1+1) 2 ADD R0,*R1 (1+1) 2 LD R0,*M (2+1) 3 对三地址代码A:=B+C 若B,C分别在R0,R1,且B值以后不用,则 (1)ADD R0,R1 (0+1) 1 若B在R0,C在内存,且B值以后不用,则 (2)ADD R1,C (1+1) 2 或(3)LD R1,C ADD R0,R1 (1+2) 3 第(3)种特别适合于C值在块内还要被引用的

文档评论(0)

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

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

1亿VIP精品文档

相关文档