资源描述:
《Ch10 目标代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、词法分析器语法分析器中间代码生成器优化段源程序单词符号语法单位四元式表格管理出错处理目标代码生成器四元式目标代码代码生成是把语法分析后或优化后的中间代码变换成目标代码。目标代码一般有以下三种形式:能够立即执行的机器语言代码,所有地址已经定位;待装配的机器语言模块。执行时,由连接装配程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;汇编语言代码。尚须经过汇编程序汇编,转换成可执行的机器语言代码。代码生成着重考虑的问题:如何使生成的目标代码较短;如何充分利用计算机的寄存器,减少目标代码中访问存贮单元的次数。如何充分利用计算机的指令系统的特点。10.1基本问题代码
2、生成器的输入代码生成器的输入包括源程序的中间表示,以及符号表中的信息类型检查10.1基本问题目标程序绝对机器代码、可再定位机器语言、汇编语言采用汇编代码作为目标语言指令选择a:=a+1INCaLDR0,aADDR0,#1STR0,a10.1基本问题寄存器分配在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量。在随后的寄存器指派阶段,挑出变量将要驻留的具体寄存器。计算顺序选择10.2目标机器模型考虑一个抽象的计算机模型具有多个通用寄存器,他们既可以作为累加器,也可以作为变址器。运算必须在某个寄存器中进行。含有四种类型的指令形式如果op是一目运行符,则“opRi,
3、M”的意义为:op(M)Ri,其余类型可类推。op包括一般计算机上常见的一些运算符,如ADD加SUB减MUL乘DIV除不考虑代码的执行效率,目标代码生成是不难的,例如:A:=(B+C)*D+E翻译为四元式:T1:=B+CT2:=T1*DT3:=T2+EA:=T310.3一个简单代码生成器假设只有一个寄存器可供使用目标代码:LDR0,BADDR0,CSTR0,T1假设T1,T2,T3在基本块之后不再引用:LDR0,BADDR0,CMULR0,DADDR0,ESTR0,A四元式T1:=B+CT3:=T2+ET2:=T1*DA:=T3LDR0,T1MULR0,DSTR0,T
4、2LDR0,T2ADDR0,ESTR0,T3LDR0,T3STR0,A10.3一个简单代码生成器四元式的中间代码变换成目标代码,并在一个基本块的范围内考虑如何充分利用寄存器:尽可能留:在生成计算某变量值的目标代码时,尽可能让该变量保留在寄存器中。尽可能用:后续的目标代码尽可能引用变量在寄存器中的值,而不访问内存。及时腾空:在离开基本块时,把存在寄存器中的现行的值放到主存中。10.3.1待用信息如果在一个基本块内,四元式i对A定值,四元式j要引用A值,而从i到j之间没有A的其他定值,那么,我们称j是四元式i的变量A的待用信息。(即下一个引用点)i:A:=BopC…j:D:
5、=AopE假设在变量的符号表登记项中含有记录待用信息和活跃信息的栏。待用信息和活跃信息的表示:1(x,x)表示变量的待用信息和活跃信息。其中i表示待用信息,y表示活跃,^表示非待用和非活跃;2在符号表中,(x,x)→(x,x)表示后面的符号对代替前面的符号对;3不特别说明,所有说明变量在基本块出口之后均为非活跃变量。计算待用信息和活跃信息的算法步骤:1.开始时,把基本块中各变量的符号表登记项中的待用信息栏填为“非待用”,并根据该变量在基本块出口之后是不是活跃的,把其中的活跃信息栏填为“活跃”或“非活跃”;2.从基本块出口到基本块入口由后向前依次处理各个四元式。对每一个四
6、元式i:A:=BopC,依次执行下面的步骤:1)把符号表中变量A的待用信息和活跃信息附加到四元式i上;2)把符号表中A的待用信息和活跃信息分别置为“非待用”和“非活跃”;3)把符号表中变量B和C的待用信息和活跃信息附加到四元式i上;4)把符号表中B和C的待用信息均置为i,活跃信息均置为“活跃”。例:基本块1.T:=A-B2.U:=A-C3.V:=T+U4.W:=V+U设W是基本块出口之后的活跃变量。建立待用信息链表与活跃变量信息链表如下:附加在四元式上的待用/活跃信息表:(4)W:=V+U(3)V:=T+U(2)U:=A-C(1)T:=A-B(^,y)(^,^)(^,^
7、)(4,y)(^,^)(4,y)(3,y)(^,^)(^,^)(3,y)(2,y)(^,^)序号四元式左值左操作数右操作数变量名初始状态→信息链(待用/活跃信息栏)→(3,y)→(^,^)→(2,y)→(1,y)→(1,y)→(2,y)→(4,y)→(^,^)→(3,y)T(^,^)A(^,^)B(^,^)C(^,^)U(^,^)V(^,^)W(^,y)→(^,^)→(4,y)→(^,^)寄存器描述数组RVALUE动态记录各寄存器的使用信息RVALUE[R]={A,B}变量地址描述数组AVALUE动态记录各变量现行值的存放位置AVALUE