目标代码生成课件_第1页
目标代码生成课件_第2页
目标代码生成课件_第3页
目标代码生成课件_第4页
目标代码生成课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目标代码一般有以下三种形式:(1)能够立即执行的机器语言代码,所有地址均已定位。(2)待装配的机器语言模块。当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码。(3)汇编语言代码,尚需经过汇编程序汇编,转换成可执行的机器语言代码。11.1基本问题11.1.1

目标程序可执行目标模块可重定位目标模块允许程序模块分别编译调用其它先前编译好的程序模块汇编语言程序免去编译器重复汇编器的工作从教学角度,增加可读性11.1

代码生成器的设计中的问题11.1.2

指令的选择 目标机器指令系统的性质决定了指令选择的难易程度,指令系统的统一性和完备性是重要的因素 指令的速度和机器特点是另一些重要的因素11.1

代码生成器的设计中的问题 若不考虑目标程序的效率,指令的选择是直截了当的。三地址语句x:=y+z(x,y和z都是静态分配)

MOV y, R0 /*把y装入寄存器R0*/ ADD z, R0 /*z加到R0上*/ MOV R0, x /*把R0存入x中*/逐个语句地产生代码,常常得到低质量的代码

11.1

代码生成器的设计中的问题语句序列

a:=b+c d:=a+e的代码如下MOV b, R0ADD c, R0MOV R0, aMOV a, R0ADD e, R0 MOV R0, d 11.1

代码生成器的设计中的问题语句序列

a:=b+c d:=a+e的代码如下MOV b, R0ADD c, R0MOV R0, aMOV a, R0 --多余的指令ADD e, R0 MOV R0, d 11.1

代码生成器的设计中的问题语句序列

a:=b+c d:=a+e的代码如下MOV b, R0ADD c, R0MOV R0, aMOV a, R0 --多余的指令ADD e, R0 --若a不再使用,第三条也MOV R0, d 多余11.1

代码生成器的设计中的问题11.1.3寄存器分配 运算对象处于寄存器中的指令通常比运算对象处于内存的指令要短一些,执行也快一些寄存器分配

选择驻留在寄存器中的一组变量寄存器指派

挑选变量要驻留的具体寄存器11.1

代码生成器的设计中的问题11.1.4计算次序的选择 某种计算次序可能会比其它次序需要较少的寄存器来保存中间结果11.2

目标机器模型11.2.1目标机器的指令系统采用模型机作为目标机器二地址指令

op 目的,源 LD {源传到目的} ADD {源加到目的} SUB {目的减去源}11.2

目标机器模型指令实例

LD R0, M

ST R0,MSTR0,4(R1)

contents(4+contents(R1)) LDR0, *4(R0)

contents(contents(4+contents(R0)))

LD R0, #111.3

一个简单的代码生成器依次考虑基本块的每个语句,为其产生代码假定三地址语句的每种算符都有对应的目标机器算符假定计算结果留在寄存器中尽可能长的时间,

除非:该寄存器要用于其它计算,或者到基本块结束11.3一个简单的代码生成器以基本块为单位来生成代码A:=(B+C)*D+EAssign.exe生成中间代码P313复习局部优化285页关于优化的说明11.3一个简单的代码生成器以基本块为单位来生成代码A:=(B+C)*D+ET1:=B+CT2:=T1*DA:=T2+E该目标代码的缺点?应该如何改进?(1)LDR0,B(2)ADDR0,C(3)STR0T1(4)LDR0,T1(5)MULR0,D(6)STR0,T2(7)LDR0,T2(8)ADDR0,E(9)STR0,A11.3一个简单的代码生成器1待用信息、寄存器描述和地址描述目的:把基本块内还要被引用的变量尽量保存在寄存器内做法:需要收集待用信息演示DaiYongXinXi.exe代码生成时需要动态的寄存器描述和地址描述11.3一个简单的代码生成器在代码生成过程中,需要跟踪寄存器的内容和名字的地址寄存器描述记住每个寄存器当前存的是什么在任何一点,每个寄存器保存若干个(包括零个)名字的值名字的地址描述记住运行时每个名字的当前值可以在哪个场所找到这个场所可以是寄存器、栈单元、内存地址、甚至是它们的某个集合这些信息可以存于符号表中这两个描述在代码生成过程中是变化的。11.3一个简单的代码生成器2简单的代码生成算法对每个三地址语句x:=yopz调用函数getreg决定放yopz计算结果的场所L查看y的地址描述,确定y值当前的一个场所y

.如果y的值还不在L中,产生指令MOVy

,L产生指令opz

,L,其中z

是z的当前场所之一如果y和/或z的当前值不再引用,在块的出口也不活跃,并且还在寄存器中,那么修改寄存器描述11.3一个简单的代码生成器寄存器选择函数函数getreg返回保存x:=yopz的x值的场所L如果名字y在R中,这个R不含其它名字的值,并且在执行x:=yopz后y不再有下次引用,那么返回这个R作为L。否则,返回一个空闲寄存器,如果有的话否则,如果x在块中有下次引用,或者op是必须用寄存器的算符,那么找一个已被占用的寄存器R(可能产生MOVR,M指令,并修改M的描述)否则,如果x在基本块中不再引用,或者找不到适当的被占用寄存器,选择x的内存单元作为L。

11.3一个简单的代码生成器语

生成的代码

寄存器描述名字地址描述

寄存器空

t1:=a

b

MOVa,R0SUBb,R0

R0含t1

t1在R0中

t2:=a

cMOVa,R1SUBc,R1R0含t1R1含t2t1在R0中t2在R1中t3:=t1+t2

ADDR1,R0

R0含t3

R1含t2

t3在R0中t2在R1中

d:=t3+t2

ADDR1,R0

R0含dd在R0中

MOVR0,d

d在R0和内存中

11.4寄存器分配为了生成更有效的目标代码,需要考虑的一个问题就是如何更有效地利用寄存器。尽可能把各变量的现行值保存在寄存器中,把基本块不再引用的变量所占用的寄存器及早释放出来

11.4寄存器分配指令的执行代价

每条指令的执行代价=每条指令访问主存单元次数十l。例如:

opRj,Rj

执行代价为1opRj,M

执行代价为2opRj,*Rj

执行代价为2opRj,*M执行代价为3

11.5DAG的目标代码为了生成更有效的目标代码,要考虑的另一个问题是,对基本块中中间代码序列,我们应按怎样的次序来生成其目标代码呢?演示DagCodeGen.exeDagCodeGenFigure11.9.exe练习11.2DagCodeGenExercise11.2.exeCodeGenExercise11.2Original.exeCodeGenExercise11.2DAGSorted.exe11.6窥孔优化窥孔优化(peepholeoptimization)

窥孔优化方法是通过考察一小段目标指令(称为窥孔)并把这些指令替换为更短和更快的一段指令,从而提高目标代码的质量。11.6窥孔优化几种典型的窥孔优化技术冗余存取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论