如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第八章代码生成8.1代码生成器的设计中的问题8.1.2指令的选择目标机器指令系统的性质决定了指令选择的难易程度,指令系统的统一性和完备性是重要的因素指令的速度和机器特点是另一些重要的因素若不考虑目标程序的效率,指令的选择是直截了当的。三地址语句x:=y+z(x,y和z都是静态分配)MOVy,R0/*把y装入寄存器R0*/ADDz,R0/*z加到R0上*/MOVR0,x/*把R0存入x中*/逐个语句地产生代码,常常得到低质量的代码语句序列a:=b+cd:=a+e的代码如下MOVb,R0ADDc,R0MOVR0,aMOVa,R0ADDe,R0MOVR0,d8.1.3寄存器分配运算对象处于寄存器中的指令通常比运算对象处于内存的指令要短一些,执行也快一些寄存器分配选择驻留在寄存器中的一组变量寄存器指派挑选变量要驻留的具体寄存器8.1.4计算次序的选择某种计算次序可能会比其它次序需要较少的寄存器来保存中间结果8.2目标机器地址模式和它们的汇编语言形式及附加代价模式形式地址附加代价绝对地址MM1寄存器RR0变址c(R)c+contents(R)1间接寄存器*Rcontents(R)0间接变址*c(R)contents(c+contents(R))1直接量#cc1指令实例MOVR0,MMOV4(R0),Mcontents(4+contents(R0))MOV*4(R0),Mcontents(contents(4+contents(R0)))MOV#1,R08.2.2指令的代价指令代价=1+源地址模式的附加代价+目的地址模式的附加代价指令代价MOVR0,R11MOVR5,M2ADD#1,R32SUB4(R0),*12(R1)3a:=b+c,a、b和c都静态分配内存单元MOVb,R0ADDc,R0代价=6MOVR0,aMOVb,aADDc,a代价=6a:=b+c,a、b和c都静态分配内存单元若R0,R1和R2分别含a,b和c的地址,则MOV*R1,*R0ADD*R2,*R0代价=2若R1和R2分别含b和c的值,并且b的值在这个赋值后不再需要,则ADDR2,R1MOVR1,a代价=38.3基本块和流图8.3.1基本块基本块:连续的语句序列,控制流从它的开始进入,并从它的末尾离开再用有向边表示基本块之间的控制流信息,就能得到程序的流图三地址语句序列的划分基本块首先确定所有的入口语句序列的第一个语句是入口语句能由条件转移语句或无条件转移语句转到的语句是入口语句紧跟在条件转移语句或无条件转移语句后面的语句是入口语句每个入口语句到下一个入口语句之前的语句序列构成一个基本块(1)prod:=0(2)i:=1(3)t1:=4*i(4)t2:=a[t1](5)t3:=4*i(6)t4:=b[t3](7)t5:=t2*t4(8)t6:=prod+t5(9)prod:=t6(10)t7:=i+1(11)i:=t7(12)ifi<=20goto(3)8.3.2基本块的变换三地址语句x:=y+z引用y和z并对x定值一个名字的值在基本块的某一点以后还要引用的话,我们说这个名字在该点是活跃的基本块的等价两个基本块计算一组同样的表达式这些表达式的值分别代表同样的活跃名字的值有很多等价变换可用于基本块局部变换全局变换删除局部公共子表达式a:=b+ca:=b+cb:=adb:=adc:=b+cc:=b+cd:=add:=b删除死代码定值x:=y+z以后不再引用,则称x为死变量交换相邻的独立语句t1:=b+ct2:=x+yt2:=x+yt1:=b+c当且仅当t1和t2不相同,x和y都不是t1,并且b和c都不是t2代数变换x:=x+0可以删除x:=x*1可以删除x:=y**2改成x:=y*y8.3.3流图把控制流信息加到基本块集合,形成一个有向图来表示程序首结点、前驱、后继初始结点:它的入口语句是程序的第一个语句对于基本块B1和B2,如果在程序中的某个执行序列中B2紧跟B1,那么B1到B2有一条有向边,如果B1的最后一条语句是条件转移或无条件转移到B2的第一个语句,或者按程序正文的次序B2紧跟