资源描述:
《第10章 目标代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第10章目标代码生成目标代码(单寄存器)临时变量的存储空间分配寄存器的分配和释放10.1目标代码虚拟目标代码:虚拟机上的目标程序。在本地机器上具备虚拟机的解释器。实际目标代码:实际机器上的指令序列绝对地址机器代码:可重定位的机器代码:汇编代码:三种硬件地址模式指令格式:Op#CR(立即-----寄存器)Opd(R1)R2(存储器-----寄存器)OpR1R2(寄存器-----寄存器)几个常见指令的含义:LoadSourceR从Source读出送入ROpSourceRSourceopR结果送入RStoreTargetRR的内容送入Target.目标代码的生成(单
2、寄存器)形如(Op,A,B,T):LoadAR;OpBR形如(ASSIG,A,B):LoadAR;StoreRB例:Z:=X*(a+b)*Y*(a+b)(+,a,b,t1)LoadaR;AddbR(*,X,t1,t2)StoreRt1;MultXR(*,t2,Y,t3)MultYR(*,t3,t1,t4)Multt1R标号和Jump的代码标号到代码地址的对应表(flag,L,Addr)形如(LabelL):当对应表中没有L项时:填写表项(1,L,Pc),Pc表示下一条目标代码的地址。当有L项(0,L,P’)时:从P’顺着链回填地址Pc形如(JumpL):对应表
3、中没有L项时构造链头P:(Jump,nil):填写表项(0,L,P);当有表项(0,L,P’)时:拉链P:(JumpP’),修改表项为(0,L,P);当有表项(1,L,P)时:取出L的地址P生成代码。过程/函数调用的代码主要工作:过函调用时:申请新AR空间参数传递转向过程体过函入口:填写AR的相关内容。过函返回时:释放AR区恢复信息返回值参数传递的代码:值参:(VALACT,a,off,1):Loada(sp)RStoreoff(top)R(VALACT,A,off,1):Load@A(sp)RStoreoff(top)R变参:(VARACT,a,off,1)
4、:LoadAa(sp)RStoreoff(top)R(VARACT,A,off,1):LoadA(sp)RStoreoff(top)R过函形参:(PROCACT,p,off,1):LoadEnter(p)RStoreoff(top)R(PROCACT,P,off,1):LoadP(sp)RStoreoff(top)R过函调用Call:传参;(Call,g,True):JumpEnter(g)(Call,G,False):Jump@G(sp)入口(Entry,Label,size,Level):填写AR信息;LoadtopspADDtopsize出口(ENDPR
5、OC,---):恢复调用前的信息和寄存器内容;保存返回值;Loadsptop;LoadDyL(sp)sp;JumpRe_A(top)10.2临时变量特点:寿命短;一次定义一次使用存储空间:尽可能采用共享办法随用随分配的动态分配:调用一个过程时,分配一个新的AR空间(不包括临时变量部分),每当要保存一个临时变量时,动态分配到栈区的可用单元中按共享法静态分配:先计算出临时变量的空间,在过程调用时和源变量一起申请空间。即调用时将临时变量安排在AR中。临时变量的静态分配定值点:如果i中间代码给临时变量T定值,则称i为临时变量T的定值点。引用点:如果j中间代码使用T,则
6、称j为T的引用点。活动区间:如果i是T的定值点,j是T的最后引用点,则称[i,j]是T的活动区间。活动区间[i,j]和[m,n]不严格相交:如果mj或in。空间分配:如果两个临时变量的活动区间不严格相交,则可以共享单元T1T2T3T4T5Offset=mOffset=m+1Offset=m+1Offset=m+1Offset=m例:10.3寄存器寄存器的分类:可分配寄存器保留寄存器零用寄存器寄存器的使用准则:寄存器先行准则寄存器活跃准则寄存器多载准则变量的状态描述:寄存器的分配分配原则:选择代价最小的寄存器寄存器状态描述:寄存器的选择代价:Store代价L
7、oad代价