欢迎来到天天文库
浏览记录
ID:76752965
大小:3.21 MB
页数:9页
时间:2022-01-19
《目标代码生成器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验报告实验课名称:编译原理实验实验名称:目标代码生成器实验班级:学号:姓名:时间:2016-4-30一、问题描述代码生成器着重考虑两个问题:一是如何使生成的目标代码较短;另一个是如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数。这两个问题直接影响代码的执行速度。其中基本问题:所有代码生成器都要面对何种中间代码输入,(是逆波兰式,四元式,还是三元式?等问题)何种代码做为目标程序,选择适当的代码指令,最优的寄存器分配方案,和计算顺序等基本问提二、数据结构设计逆波兰式è目标代码,采用堆栈。charx1,x2;/从语义栈中弹出俩个操作数,
2、用于判断与运算/x2=SEM.top();/SEM.top记得后面要加(),否则没有值!!!/cout<3、寄存器中,则把寄存器取作B’和C’3.如果B’≠R,则生成目标代码:LDR,B’opR,C’否则生成目标代码opR,C’如果B’或C’为R,则删除AVALUE[B]或AVALUE[C]中的R。4.令AVALUE[A]={R},RVALUE[R]={A}。5.若B或C的现行值在基本块中不再被引用,也不是基本块出口之后的活跃变量,且其现行值在某寄存器Rk中,则删除RVALUE[Rk]中的B或C以及AVALUE[B]或AVALUE[C]中的Rk,使得该寄存器不再为B或C占用。寄存器分配:GETREG(i:A:=BopC)返回一个用来存放A的值的寄存器4、(1)如果B的现行值在某个寄存器Ri中,RVALUE[Ri]中只包含B,此外,或者B与A是同一个标识符,或者B的现行值在执行四元式A:=BopC之后不会再引用,则选取Ri为所需要的寄存器R,并转4;(2)如果有尚未分配的寄存器,则从中选取一个Ri为所需要的寄存器R,并转4;(3)从已分配的寄存器中选取一个Ri为所需要的寄存器R。最好使得Ri满足一下条件:占用Ri的变量的值也同时存放在该变量的贮存单元中,或者在基本块中要在最远的将来才会引用到或不会引用到。对RVALUE[Ri]中每一变量M,如果M不是A,或者如果M是A又是C,但不是B并且B也不在5、RVALUE[Ri]中,则1)如果AVALUE[M]不包含M,则生成目标代码STRi,M2)如果M是B,或者M是C但同时B也在RVALUE[Ri]中,则令AVALUE[M]={M,Ri},否则令AVALUE[M]={M}3)删除RVALUE[Ri]中的M(4)给出R,返回。中间代码目标代码RVALUEAVALUET:=A-BLDR0,AR0含有TT在R0中SUBR0,BU:=A-CLDR1,AR0含有TT在R0中SUBR1,CR1含有UU在R1中V:=T+UADDR0,R1R0含有VV在R0中R1含有UU在R0中D:=V+UADDR0,R1R06、含有DD在R0中分配操作寄存器R:GETREG(i:A:=BOPC)取B,C现行值存放的位置B′,C′B′:=AVALUE[B]C′:=AVALUE[C]B′=R?生成目标代码OpR,C′生成目标代码LDR,B′OPR,C′yesno图1.1设计流程图程序代码:#include/基本输入输出流/#include/运用栈,省去自己再写栈/#include#include#includeusingnamespacestd;/数据结构逆波兰式è目标代码//目标代码7、指令:LD,ST,ADD,SUB,MUL,DIV相应的数值:1,2,3,4,5,6数据段开始:设置为a-z;单个寄存器acc为寄存器标志:为0表示为空,非0,被占用/chartemp=’a’-1;/临时变量a-z/stackSEM;/语义栈/ints;/栈指针/typedefstruct{intop;/操作符对应的数值/charrt;/单个寄存器/charnum;/操作数/}ObjType;ObjTypeOB[40];/目标代码区/into_pt=0;/区指针/intacc;/寄存器标志/charblexp[40];/逆波兰式区//8、代码区//函数声明/intisop(char);/判断操作符是否是+-//voidbuild(char);/根据操作符生成目标代码函数/voidB_O
3、寄存器中,则把寄存器取作B’和C’3.如果B’≠R,则生成目标代码:LDR,B’opR,C’否则生成目标代码opR,C’如果B’或C’为R,则删除AVALUE[B]或AVALUE[C]中的R。4.令AVALUE[A]={R},RVALUE[R]={A}。5.若B或C的现行值在基本块中不再被引用,也不是基本块出口之后的活跃变量,且其现行值在某寄存器Rk中,则删除RVALUE[Rk]中的B或C以及AVALUE[B]或AVALUE[C]中的Rk,使得该寄存器不再为B或C占用。寄存器分配:GETREG(i:A:=BopC)返回一个用来存放A的值的寄存器
4、(1)如果B的现行值在某个寄存器Ri中,RVALUE[Ri]中只包含B,此外,或者B与A是同一个标识符,或者B的现行值在执行四元式A:=BopC之后不会再引用,则选取Ri为所需要的寄存器R,并转4;(2)如果有尚未分配的寄存器,则从中选取一个Ri为所需要的寄存器R,并转4;(3)从已分配的寄存器中选取一个Ri为所需要的寄存器R。最好使得Ri满足一下条件:占用Ri的变量的值也同时存放在该变量的贮存单元中,或者在基本块中要在最远的将来才会引用到或不会引用到。对RVALUE[Ri]中每一变量M,如果M不是A,或者如果M是A又是C,但不是B并且B也不在
5、RVALUE[Ri]中,则1)如果AVALUE[M]不包含M,则生成目标代码STRi,M2)如果M是B,或者M是C但同时B也在RVALUE[Ri]中,则令AVALUE[M]={M,Ri},否则令AVALUE[M]={M}3)删除RVALUE[Ri]中的M(4)给出R,返回。中间代码目标代码RVALUEAVALUET:=A-BLDR0,AR0含有TT在R0中SUBR0,BU:=A-CLDR1,AR0含有TT在R0中SUBR1,CR1含有UU在R1中V:=T+UADDR0,R1R0含有VV在R0中R1含有UU在R0中D:=V+UADDR0,R1R0
6、含有DD在R0中分配操作寄存器R:GETREG(i:A:=BOPC)取B,C现行值存放的位置B′,C′B′:=AVALUE[B]C′:=AVALUE[C]B′=R?生成目标代码OpR,C′生成目标代码LDR,B′OPR,C′yesno图1.1设计流程图程序代码:#include/基本输入输出流/#include/运用栈,省去自己再写栈/#include#include#includeusingnamespacestd;/数据结构逆波兰式è目标代码//目标代码
7、指令:LD,ST,ADD,SUB,MUL,DIV相应的数值:1,2,3,4,5,6数据段开始:设置为a-z;单个寄存器acc为寄存器标志:为0表示为空,非0,被占用/chartemp=’a’-1;/临时变量a-z/stackSEM;/语义栈/ints;/栈指针/typedefstruct{intop;/操作符对应的数值/charrt;/单个寄存器/charnum;/操作数/}ObjType;ObjTypeOB[40];/目标代码区/into_pt=0;/区指针/intacc;/寄存器标志/charblexp[40];/逆波兰式区//
8、代码区//函数声明/intisop(char);/判断操作符是否是+-//voidbuild(char);/根据操作符生成目标代码函数/voidB_O
此文档下载收益归作者所有