《目标代码生成》PPT课件.ppt
第九章 目标代码生成,源程序,编译前端,代码生成,符号表,代码优化,目标程序,中间代码,中间代码,对代码生成器的要求是严格的,它输出的代码必须正确而且质量高。,质量高的含义是它应该有效地利用机器的资源,,此外,代码生成器本生也应该高效地运行.,代码生成的输入:中间代码和符号表,目标代码的形式:,机器语言代码,机器语言模块,汇编语言代码,目标代码生成重点要考虑的问题:,生成的目标代码较短,充分利用寄存器,减少存储单元访问次数,9.1基本问题,一.代码生成器的输入,已确定的中间代码形式,所有信息已填入符号表,用于产生数据对象的运行时地址,二.目标程序,绝对机器代码:所有地址均已定位,可立即执行,可再定位机器代码:允许子程序单独 编译,汇编语言:使代码生成变得容易,三.指令选择,丰富的机器指令会使生成的目标代码质量更、高、速度更快,例:I=I+1 用inc I 实现比用,LD R0 I,ADD R0#1ST R0 I,生成的代码质量高,四、存贮管理,把源程序中的名字映射成运行时数据对象的地址是由前端的代码生成器共同完成的,PROCEDURE sub(x,y:real);VAR i,j:integer;a:ARRAY1.5 OF real;e,f:real;BEGIN f:=e+i*j;END;,f,符号表,名字 形 类型 偏移量,活动记录布局=,老SP,(sp,0),x 形 real 3,返回地址,(sp,1),y 形 real 4,2,(sp,2),(sp,3),(sp,5),i int 5,i,(sp,9),j int 9,j,(sp,13),a array 13,a,(sp,53),e,e real 53,(sp,61),f real 61,(sp,4),x,y,t1,t2,t3,(sp,62),(sp,63),(sp,64),中间代码*i j t1*(sp,5)(sp,9)(sp,62)+e t1 t2+(sp,53)(sp,62)(sp,63)itor t2 t3 itor(sp,63)(sp,64):=t3 f:=(sp,64)(sp,61),五、寄存器的分配,操作数在寄存器中的指令通常要比操作数在内存中的指令短一些,执行也要快一些,充分利用寄存器对生成好的代码尤其重要。,1、选择要驻留在寄存器中的变量,2、选出分配给驻留在寄存器中的变量的寄存器,需要考虑的问题:,寄存器的分配原则:,1.选择已被变量占用,但变量以后可能不被引用的寄存器,2.已分配寄存器,且存放的变量在较远的结点才被引用,3.分配空闲的寄存器,使用专用寄存器,六、计算次序的选择,七、代码生成方法,计算执行的次序会影响目标代码的效率,评判代码生成器的最重要的准则是产生正确的代码,除此之外,易于实现、测试和维护也是重要的设计目标,9.2目标机器:,熟悉目标机器及其指令是设计一个好的代码生成器的先决条件,BX、BP基址寄存器SI、DI变址寄存器,。转移指令JNZ、JMP、CALL、RET,2。运算指令ADDRR/M SUBRR/M MULRR/M DIVRR/M COMPRR/M,。寻址功能:寄存器寻址:MOVAXBX直接寻址:MOVAXDATA基址(变址)位移:MOVDI,BX20H,9.3常用四元式的翻译方法,1。四元式(program,prg_id,)MAIN SEGMENT:ASSUMECS:MAIN,DS:MAIN,ES:MAIN),2。四元式(ret,p)JMP p,3。四元式(+,A,B,T)MOV AX,AADD AX,BMOV T,AX,4。四元式(-,A,_,T)MOV AX,ANEG AX MOV T,AX,7.四元式(=,A,T1T2)MOV SI T2 MOV AX,AMOV SI+T1,AX,8。四元式(JNZ,A,P)MOV AX A JNZ P,10。四元式(J,A,B,P)MOV AX A CMP AX,BJL P,9。四元式(J,P)JMP P,