欢迎来到天天文库
浏览记录
ID:33544396
大小:217.00 KB
页数:67页
时间:2018-05-25
《编译器的设计与实现ppt课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译器的设计与实现ppt制作:张云时间:2008-03回顾语言设计简单的C目标机器建模编译系统框架一些主要的数据结构(词法节点,语法节点,中间表示,目标代码)目标代码的运行本节内容描述目标代码的生成:如何从中间表示(语法树)得到目标代码呢?示例:声明语句赋值语句If语句while语句函数调用与返回问题要处理什么样的C代码?对应的语法树结构(中间表示)是什么?对应什么样的asm代码?如何生成目标代码?具体实现编译器前端编译器后端源程序中间表示目标代码*.c*.asm语法树要处理什么样的C代码?简化的C函数调用与返回If语句While语句赋值语句表达式数组声明语句控制
2、语句示例intf1(intx,inty){if(x3、idWidget(intx,inty){inta,b;a=x+y;b=x-y;}变量名类型数组?位置其它xint01yint02aint01bint02函数名返回类型参数个数参数列表局部变量个数局部变量列表wigetvoid22…ba返回地址主调函数的bpXY…bpsp相对位置!对于例子intp;p=1;变量名类型数组?地址其它pint01aint12…在遇到intp;语句的时候,建立对应的符号表项,如图:遇到赋值语句p=1;以后,查找符号表中名称为p的项,找到p的相对地址1,因此,p的地址是:bp+1+1同样,可以得到数组元素a[2]的地址a的地址=bp+1+24、a[2]的地址=bp+1+2+2ppcA[0]Old_bpA[1]A[2]……bp0+1+2+3+4+5asm代码p=1;(假定p的相对地址为1)生成代码如下:movax,1mov[bp+1+1],axa[2]=7;(假定a的相对地址为2)生成代码如下:movax,7mov[bp+1+2+2],ax赋值语句具体实现扫描语法树的过程中,遇到赋值节点赋值节点p1switch(tn.NType){caseNodeType.AssignStm:if(tn.child[0].NType==NodeType.VarID){//根据变量名查找符号表,取出变量的地址varaddr5、=varProcess(tn.child[0]);//表达式语句处理;最终结果存放到ax中expProcess(tn.child[1]);Codetmpcode=this.NextCode();tmpcode.Op="MOV";tmpcode.Arg1=varaddr;tmpcode.Arg2="AX";}break;……}//查找符号表,找出变量的相对地址,构造变量的地址,返回stringvarProcess(TreeNodetn){Stringvaraddr;//局部变量?参数变量?全局变量?注意区分!VarInfoVarsym=getvar(symtable6、,tn);If(varsym!=null){Varaddr=“[bp+1+”+Varsym.rva+”]”;}Returnvaraddr;}voidexpProcess(TreeNodetn){switch(tn.NType){caseNodeType.VarID:varaddr=varProcess(tn);tmpcode=NextCode();tmpcode.Op="MOV";tmpcode.Arg1="AX";tmpcode.Arg2=varaddr;break;caseNodeType.ConstID:tmpcode=NextCode();tmpcode.7、Op="MOV";tmpcode.Arg1="AX";tmpcode.Arg2=tn.nodestr;break;caseNodeType.ADD:expProcess(tn.child[1]);tmpcode=NextCode();tmpcode.Op="MOV";tmpcode.Arg1=“BX";tmpcode.Arg2=“AX”;expProcess(tn.child[0]);Tmpcode=NextCode();tmpcode.Op=“ADD";tmpcode.Arg1=“AX";tmpcode.Arg2=“BX”;break;caseNodeType.8、FunCa
3、idWidget(intx,inty){inta,b;a=x+y;b=x-y;}变量名类型数组?位置其它xint01yint02aint01bint02函数名返回类型参数个数参数列表局部变量个数局部变量列表wigetvoid22…ba返回地址主调函数的bpXY…bpsp相对位置!对于例子intp;p=1;变量名类型数组?地址其它pint01aint12…在遇到intp;语句的时候,建立对应的符号表项,如图:遇到赋值语句p=1;以后,查找符号表中名称为p的项,找到p的相对地址1,因此,p的地址是:bp+1+1同样,可以得到数组元素a[2]的地址a的地址=bp+1+2
4、a[2]的地址=bp+1+2+2ppcA[0]Old_bpA[1]A[2]……bp0+1+2+3+4+5asm代码p=1;(假定p的相对地址为1)生成代码如下:movax,1mov[bp+1+1],axa[2]=7;(假定a的相对地址为2)生成代码如下:movax,7mov[bp+1+2+2],ax赋值语句具体实现扫描语法树的过程中,遇到赋值节点赋值节点p1switch(tn.NType){caseNodeType.AssignStm:if(tn.child[0].NType==NodeType.VarID){//根据变量名查找符号表,取出变量的地址varaddr
5、=varProcess(tn.child[0]);//表达式语句处理;最终结果存放到ax中expProcess(tn.child[1]);Codetmpcode=this.NextCode();tmpcode.Op="MOV";tmpcode.Arg1=varaddr;tmpcode.Arg2="AX";}break;……}//查找符号表,找出变量的相对地址,构造变量的地址,返回stringvarProcess(TreeNodetn){Stringvaraddr;//局部变量?参数变量?全局变量?注意区分!VarInfoVarsym=getvar(symtable
6、,tn);If(varsym!=null){Varaddr=“[bp+1+”+Varsym.rva+”]”;}Returnvaraddr;}voidexpProcess(TreeNodetn){switch(tn.NType){caseNodeType.VarID:varaddr=varProcess(tn);tmpcode=NextCode();tmpcode.Op="MOV";tmpcode.Arg1="AX";tmpcode.Arg2=varaddr;break;caseNodeType.ConstID:tmpcode=NextCode();tmpcode.
7、Op="MOV";tmpcode.Arg1="AX";tmpcode.Arg2=tn.nodestr;break;caseNodeType.ADD:expProcess(tn.child[1]);tmpcode=NextCode();tmpcode.Op="MOV";tmpcode.Arg1=“BX";tmpcode.Arg2=“AX”;expProcess(tn.child[0]);Tmpcode=NextCode();tmpcode.Op=“ADD";tmpcode.Arg1=“AX";tmpcode.Arg2=“BX”;break;caseNodeType.
8、FunCa
此文档下载收益归作者所有