欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    编译原理第十章.ppt

    • 资源ID:82762396       资源大小:741.50KB        全文页数:76页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理第十章.ppt

    第十章第十章 目标代码生成目标代码生成 编译器的逻辑结构编译器的逻辑结构表表 处处 理理 错错 误误 处处 理理 目目标标代代码码生生成成中中间间代代码码优优化化中中间间代代码码生生成成语语义义分分析析语语法法分分析析词词法法分分析析目目标标程程序序源源程程序序 10.1 目标代码生成概述目标代码生成概述 10.2 虚拟机虚拟机 10.3 寄存器的分配寄存器的分配 10.4 四元式到目标代码的翻译四元式到目标代码的翻译 10.1 目标代码生成介绍目标代码生成介绍10.1.1 10.1.1 代码生成器的输入和输出代码生成器的输入和输出l代码生成器:把源程序的某种中间表示代码生成器:把源程序的某种中间表示转换成目标代码;转换成目标代码;l目标代码生成器的输入目标代码生成器的输入:源程序的某种中源程序的某种中间表示(还可能有符号间表示(还可能有符号)。l目标代码生成的输出:与源程序等价的目标代码生成的输出:与源程序等价的目标代码。目标代码。l中间代码的表示形式中间代码的表示形式l 后缀式后缀式(栈式栈式)中间代码中间代码l 三地址中间代码三地址中间代码(三元式和四元式三元式和四元式)l 图结构中间代码图结构中间代码(树,树,DAG)DAG)本章以四元式形式的中间代码为例来讨论生成目标代码的基本方法,这里所采用的技术同样适用于其它形式的中间表示。l目标代码一般有以下三种形式:目标代码一般有以下三种形式:1.1.绝对机器语言代码绝对机器语言代码 绝对机器语言代码即是绝对机器语言代码即是能够立即执行的机器语言代码能够立即执行的机器语言代码,代码中所有地代码中所有地址均已定位,编译后可直接执行。址均已定位,编译后可直接执行。这种形式的目标代码执行速度最快,但由于不这种形式的目标代码执行速度最快,但由于不能重定位,这种形式缺乏灵活性。在编译过程中,能重定位,这种形式缺乏灵活性。在编译过程中,通常要把整个源程序一起编译,而不能独立地编译通常要把整个源程序一起编译,而不能独立地编译源程序中的各个程序模块,一般只适用于需要快速源程序中的各个程序模块,一般只适用于需要快速编译执行的小型程序;编译执行的小型程序;2.2.可重定位的机器语言代码可重定位的机器语言代码 当程序执行当程序执行时,必须由时,必须由连接装连接装入程序把它们和一些入程序把它们和一些运行时子程序连接起来,转换成可立即运行时子程序连接起来,转换成可立即执行的机器语言代码。执行的机器语言代码。程序经汇编或编译后生成的目标代码通常程序经汇编或编译后生成的目标代码通常采用相对地址的形式,它的起始地址是不采用相对地址的形式,它的起始地址是不确定的,这样的代码被称为确定的,这样的代码被称为可重定位的可重定位的。连接程序连接程序负责将分别在不同的目标文件中编负责将分别在不同的目标文件中编译或汇编的代码集中到一个可执行文件中,译或汇编的代码集中到一个可执行文件中,并将目标程序和标准库函数的代码以及计算并将目标程序和标准库函数的代码以及计算机操作系统提供的资源连接在一起。连接程机操作系统提供的资源连接在一起。连接程序对操作系统和目标机有极大的依赖性。序对操作系统和目标机有极大的依赖性。装配程序装配程序用来把程序加载到内存储器中,以便执用来把程序加载到内存储器中,以便执行。装入程序可处理所有的与指定的基地址或起行。装入程序可处理所有的与指定的基地址或起始地址有关的可重定位的地址,它使得可执行代始地址有关的可重定位的地址,它使得可执行代码更加灵活。码更加灵活。这种形式的目标代码虽然比较繁琐,连接和这种形式的目标代码虽然比较繁琐,连接和装入时要付出一定的代价,但各个子程序模块可装入时要付出一定的代价,但各个子程序模块可以分别编译,给程序开发带来了极大的灵活性。以分别编译,给程序开发带来了极大的灵活性。装配程序装配程序示例示例 3.3.汇编语言代码汇编语言代码 汇编语言代码必须经过汇编程序汇编语言代码必须经过汇编程序汇编,将其转换成可执行的机器语言代码。汇编,将其转换成可执行的机器语言代码。汇编语言代码作为目标代码生成最容易汇编语言代码作为目标代码生成最容易,无需生成无需生成二进制代码只需生成符号化的指令即可二进制代码只需生成符号化的指令即可.10.1.2 指令选择指令选择 l目标代码的质量常用目标指令的条数和执行速度来衡量。目标代码的质量常用目标指令的条数和执行速度来衡量。指令的执行代价指令的执行代价 规定访问内存一次的代价为规定访问内存一次的代价为1,执行一次操作的代,执行一次操作的代价为价为1.l目标代码的质量与编译技术有关:目标代码的质量与编译技术有关:例例1,对赋值语句,对赋值语句 x=y+z可以翻译成如下的目标代码序列:可以翻译成如下的目标代码序列:LD R,y ADD R,z ST x,Rl例例2 2,对源程序代码片断:,对源程序代码片断:a=b+ca=b+c d=a+e d=a+e可被翻译成代码段1:LD R,b ADD R,c ST a,R LD R,a ADD R,e ST d,R可被翻译成代码段3:LD R,b ADD R,c ADD R,e ST d,R可被翻译成代码段2:LD R,bADD R,cST a,R ADD R,eST d,Rl目标代码的质量与目标机的指令系统有关:指令系统目标代码的质量与目标机的指令系统有关:指令系统丰富的目标机,对给定的操作可以提供多种实现方法,丰富的目标机,对给定的操作可以提供多种实现方法,不同的实现方法之间的效率差别可能会非常大。不同的实现方法之间的效率差别可能会非常大。例例3 3,对赋值语句,对赋值语句 a=a+1a=a+1 若目标机指令集中有若目标机指令集中有“自增自增”指令指令INCINC,就可以,就可以被高效地翻译为一条指令:被高效地翻译为一条指令:INC a;INC a;否则,按照前面否则,按照前面的模式将被翻译为指令序列:的模式将被翻译为指令序列:LD R,aLD R,aADD R,1ADD R,1ST a,RST a,R10.2 虚拟机虚拟机l定义一台虚拟机作为目标机器,该虚拟机具有定义一台虚拟机作为目标机器,该虚拟机具有代表性的指令系统和硬件结构,在其上介绍目代表性的指令系统和硬件结构,在其上介绍目标代码生成的基本原理,这里所介绍的代码生标代码生成的基本原理,这里所介绍的代码生成技术也可以很容易的应用到其它类型的计算成技术也可以很容易的应用到其它类型的计算机上。机上。l假定虚拟的目标机按字编址,拥有假定虚拟的目标机按字编址,拥有1 1个通用寄个通用寄存器存器R R,每个机器字存放一条指令。指令的格,每个机器字存放一条指令。指令的格式为:式为:OP destinationOP destination,sourcesourcelsource source 和和destinationdestination可以是立即数、可以是立即数、寄存器、寄存器、存储字地址存储字地址(绝对地址或以(绝对地址或以及及以以寻址方式寻址方式表示表示的地址的地址),但),但不能同时为存储字地址。例如:不能同时为存储字地址。例如:Op Op R,C R,C/#C/#C (寄存器寄存器-立即)立即)Op Op R,d(R)R,d(R)(寄存器寄存器-寻址方式组合)寻址方式组合)Op Op R,M R,M (寄存器寄存器-存储字)存储字)表示方式:表示方式:(地址):含义(地址):含义为为 此此地址地址的的内容,即内容,即content(地址)。地址)。虚拟机的寻址方式虚拟机的寻址方式寻址方式寻址方式汇编形式汇编形式地址地址绝对地址绝对地址 M M(内存单元)内存单元)寄存器寄存器 R R(寄存器)(寄存器)变址变址 C(R)(变址寄存器(变址寄存器R的内容)的内容)C+content(R)(内存单元)内存单元)间接寄存器间接寄存器*R(寄存器内存放的(寄存器内存放的是操作数的地址)是操作数的地址)Content(R)(内存单元)内存单元)间接变址间接变址*C(R)Content(C+content(R)(内存单元)内存单元)立即数立即数 C/#C 虚拟机指令系统虚拟机指令系统 指令名称指令名称 指令形式指令形式 指令含义指令含义 读读 IN R 读指令,将外读指令,将外部值输入到寄部值输入到寄存器存器R中中 写写 OUT R 写指令,将寄写指令,将寄存器存器R中的值输中的值输出出 取数取数 LD R,A(A表示表示源操作源操作数地址数地址)将将地址地址A中的内中的内容存入寄存器容存入寄存器R中中 存数存数 ST A,R 将寄存器将寄存器R中的内容存中的内容存入入地址地址A中中操作操作(ADD,SUB,MULT,DIV)OP R,A 将将地址地址A中中的内容与寄的内容与寄存器中的内容进行存器中的内容进行op操操作,并将结果存入寄存作,并将结果存入寄存器器R中中 按真转移按真转移 JMP1 R,A(R)=ture,则转向则转向地址地址A按假转移按假转移 JMP0 R,A(R)=false,则转向则转向地址地址A无条件转无条件转移移 JMP A 无条件转向无条件转向地址地址A取地址取地址 LEA R,A将地址将地址A放入寄放入寄存器存器R中中块传送块传送MOVEB addr1,addr2,size将起始地址为将起始地址为addr1,长度为长度为size的内存区中的内存区中的内容传送到的内容传送到起始地址为起始地址为addr2的内存区的内存区 寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,它们可用来暂存指令、数据和位址。指令的执行代价 规定访问内存一次的代价为1;规定执行一次操作的代价为1;寄存器分配的原则 选择代价最小的寄存器。10.3 寄存器的分配寄存器的分配10.3.1 单寄存器机器的寄存器分配 原则是尽可能地减少加载和存储操作数的次数(即访问内存的次数),使得指令的执行代价最小。即应按照生成指令条数最少的原则将该寄存器按次序分配给不同的变量。10.3.2 多寄存器机器的寄存器分配多寄存器的分配主要涉及两个问题。多寄存器的分配主要涉及两个问题。第一个问题 在计算一个表达式时,如何使所需的寄存器个数最少?Expr1Expr2 OP例:n1=3,n2=10计算exp1需要n1个寄存器计算exp2需要n2个寄存器l当n1 2时(构造型数据类型),赋值语句四元式可能生成的目标代码有如下四种:1.left是直接变量,right也是直接变量的情形,生成的目标代码如下:MOVEB right,left,n2.left是直接变量,right是间接变量的情形,生成的目标代码如下:MOVEB *right,left,n3.left是间接变量,right是直接变量的情形,生成的目标代码如下:MOVEB right,*left,n4.left是间接变量,right也是间接变量的情形,生成的目标代码如下:MOVEB *right,*left,n10.4.3 输入输出语句四元式的翻译输入输出语句四元式的翻译l输入语句四元式的一般形式为:输入语句四元式的一般形式为:(READ,_,_,A)表示将一个外部值读入到变量表示将一个外部值读入到变量A A中,则生成的代码下:中,则生成的代码下:IN R ST A,Rl输出语句的四元式形式一般为:输出语句的四元式形式一般为:(WRITE,A,_,_)表示将变量表示将变量A A的值输出,它生成的目标代码为:的值输出,它生成的目标代码为:LD R,A OUT R l一般来说,条件语句有如下两种形式:一般来说,条件语句有如下两种形式:if then S if then else else if then S if then lif E then Sif E then S1 1 else S else S2 2中间代码结构中间代码结构:E E 的中间代码的中间代码(THEN,E.FORM,(THEN,E.FORM,)S S1 1 的中间代码的中间代码(ELSE,(ELSE,)S S2 2 的中间代码的中间代码(ENDIF,(ENDIF,)10.4.4 10.4.4 条件语句四元式的翻译条件语句四元式的翻译lif E then Sif E then S1 1中间代码结构中间代码结构:E E 的中间代码的中间代码(THEN,E.FORM,(THEN,E.FORM,)S S1 1 的中间代码的中间代码(ENDIF,(ENDIF,)带带带带ELSEELSEELSEELSE子句的条件语句四元式的翻译子句的条件语句四元式的翻译子句的条件语句四元式的翻译子句的条件语句四元式的翻译l带条件语句的四元式中间代码结构:带条件语句的四元式中间代码结构:E E 的中间代码的中间代码 (THEN,t,(THEN,t,)S S1 1 的中间代码的中间代码 (ELSE,(ELSE,)S S2 2 的中间代码的中间代码 (ENDIF,(ENDIF,)A1A2 JMP A LD R,t/*tA2AA1 JUMP0 R,A2+1A1 JUMP0 R,?A2 JMP?当前可用的目标代码的地址当前可用的目标代码的地址S S1 1 的目标代码的目标代码S S 2 2的目标代码的目标代码E E 的目标代码的目标代码l四元式(四元式(THEN,t,_,_THEN,t,_,_)生成的目标代)生成的目标代码为:码为:LD R,t LD R,t/*t/*t JUMP0 R,?JUMP0 R,?JUMP0 JUMP0指令的目的地址暂时还无法确定,所指令的目的地址暂时还无法确定,所以只能空缺以只能空缺,等待以后回填。等待以后回填。在生成上述目标代码的同时将指令在生成上述目标代码的同时将指令“JUMP0 JUMP0 R,?R,?”的地址压入栈的地址压入栈S S,以便后面进行回填。,以便后面进行回填。l四元式(四元式(ELSE,_,_,_ ELSE,_,_,_)生成的目标代)生成的目标代码为:码为:JMP?JMP??JMPJMP指令的功能是跳转到条件语句结束处,它的目指令的功能是跳转到条件语句结束处,它的目的地址因为暂时还无法确定,所以只能空缺的地址因为暂时还无法确定,所以只能空缺,等待等待以后回填。以后回填。在生成这条指令的时候,在生成这条指令的时候,THENTHEN子句已经处理完,子句已经处理完,上面上面JUMP0JUMP0指令的目的地址已经可以确定,所以这指令的目的地址已经可以确定,所以这时我们应该回填这个地址。设指令时我们应该回填这个地址。设指令“JMP?JMP??”所在的地址为所在的地址为A,A,则则JUMP0JUMP0的目的地址显然应为的目的地址显然应为A+1A+1,从栈,从栈S S中弹出栈顶元素,按照其中的地址找中弹出栈顶元素,按照其中的地址找到指令:到指令:“JUMP0 R,JUMP0 R,?”,将其修改为:将其修改为:JUMP0 R,A+1JUMP0 R,A+1。指令指令JMP?JMP??的目的地址此时还无法确定,的目的地址此时还无法确定,所以将它的地址压入栈所以将它的地址压入栈S S,等待后面回填。,等待后面回填。l(ENDIF,_,_,_ENDIF,_,_,_)的处理)的处理:不产生目标代码,只负责完成不产生目标代码,只负责完成ELSEELSE子句的地址子句的地址回填工作。回填工作。设当前地址可用地址为设当前地址可用地址为A A,则此地址即为指令,则此地址即为指令“JMP?JMP??”的目的地址我们从栈的目的地址我们从栈S S中弹出中弹出栈顶元素,按照其中的地址找到指令:栈顶元素,按照其中的地址找到指令:“JMP JMP??”将其修改为:将其修改为:JMP A JMP A。无无ELSEELSE子句的条件语句四元式的翻译子句的条件语句四元式的翻译l无无ELSEELSE子句条件语句的四元式中子句条件语句的四元式中间代码结构:间代码结构:E E 的中间代码的中间代码 (THEN,t,(THEN,t,)S S 的中间代码的中间代码 (ENDIF,(ENDIF,)A1 JUMP0 R,?A1 LD R,t/*t/*tAA1 JUMP0 R,A当前可用的目标代码的地址当前可用的目标代码的地址S S 的目标代码的目标代码E E 的目标代码的目标代码10.4.5 10.4.5 循环语句四元式的翻译循环语句四元式的翻译l以以whilewhile循环为例来说明循环语句的目标循环为例来说明循环语句的目标代码生成过程。代码生成过程。lWhileWhile语句的中间代码语句的中间代码 结构:结构:(WHILE,(WHILE,)E E 的中间代码的中间代码(DO,E.FORM,(DO,E.FORM,)S S的中间代码的中间代码(ENDWHILE,(ENDWHILE,)lWhileWhile语句的处理思想语句的处理思想:四元式(四元式(WHILE,_,_,_WHILE,_,_,_)标记了)标记了whilewhile语句的入口地址,需要保存以作为重新语句的入口地址,需要保存以作为重新转入的目的地址。考虑到转入的目的地址。考虑到whilewhile语句可以嵌套语句可以嵌套使用,我们使用一个栈使用,我们使用一个栈S S来保存这个入口地址。来保存这个入口地址。四元式(四元式(DO,t,_,_ DO,t,_,_)只能生成半条跳)只能生成半条跳转指令:转指令:“JUMP0 R,?JUMP0 R,?”,其中空缺的地,其中空缺的地址部分等待处理完循环体后回填。和条件语句类址部分等待处理完循环体后回填。和条件语句类似,为了保存待回填的指令的所在地址,我们似,为了保存待回填的指令的所在地址,我们还需要使用一个栈还需要使用一个栈Q Q。四元式(四元式(ENDWHILE,_,_,_ENDWHILE,_,_,_)是)是whilewhile语语句的结尾部分。此时整个句的结尾部分。此时整个whilewhile语句已经处理完,语句已经处理完,应该回填应该回填DODO四元式中的转向地址,同时根据语义四元式中的转向地址,同时根据语义要产生一个转向要产生一个转向whilewhile语句入口处的无条件跳转,语句入口处的无条件跳转,因为这个入口地址已经保存在栈因为这个入口地址已经保存在栈S S中,所以这里中,所以这里可以直接生成完整的跳转指令,无需回填。可以直接生成完整的跳转指令,无需回填。l(WHILE,_,_,_WHILE,_,_,_)设当前地址为设当前地址为A A,则将,则将A A压入到栈压入到栈S S中。中。l(DO,t,_,_ DO,t,_,_)这条四元式所产生的目标代码为:这条四元式所产生的目标代码为:LD R,t LD R,t JUMP0 R,?JUMP0 R,?将其地址压入栈将其地址压入栈Q Ql(ENDWHILE,_,_,_ENDWHILE,_,_,_)产生的目标代码产生的目标代码为为:JMP A JMP A A A为从栈为从栈S S中取出的地址中取出的地址还应回填前面还应回填前面DODO四元式所产生的、栈四元式所产生的、栈Q Q的栈顶元素:的栈顶元素:半条指令半条指令“JUMP0 R,JUMP0 R,?”为为“JUMP0 R,BJUMP0 R,B”(设当前地址为设当前地址为B B)。P183-4 试写出下述程序段的目标代码,其中变量均为非形参实型变量。X=u*w/(u*l+1);Y=u*j/(X+k)X=u*w/(u*l+1);1.(MULTF,u,w,t1)2.(MULTF,u,l,t2)3.(ADDF,t2,1,t3)4.(DIVF,t1,t3,t4)5.(ASSIG,t4,2,X)Y=u*j/(X+k)6.(MULTF,u,j,t5)7.(ADDF,X,k,t6)8.(DIVF,t5,t6,t7)9.(ASSIG,t7,2,Y)1.LD R,u2.MULT R,w3.ST t1,R4.LD R,u5.MULT R,l6.ST t2,R7.LD R,t28.ADD R,19.ST t3,R10.LD R,t111.DIV R,t312.ST t4,R13.LD R,t414.ST X,R1.(MULTF,u,w,t1)2.(MULTF,u,l,t2)3.(ADDF,t2,1,t3)4.(DIVF,t1,t3,t4)5.(ASSIG,t4,2,X)15.LD R,u16.MULT R,j17.ST t5,R18.LD R,X19.ADD R,k20.ST t6,R21.LD R,t522.DIV R,t623.ST t7,R24.LD R,t725.ST Y,R6.(MULTF,u,j,t5)7.(ADDF,X,k,t6)8.(DIVF,t5,t6,t7)9.(ASSIG,t7,2,Y)中间代码结构:中间代码结构:(WHILE,-,-,-)(WHILE,-,-,-)x 0)y=y-x;else while(y 0)y=y+x;的中间代码的中间代码(ENDWHILE,-,-,-)(ENDWHILE,-,-,-)WhileWhile语句的中间代码结构:语句的中间代码结构:(WHILE,-,-,-)(WHILE,-,-,-)E E 的中间代码的中间代码(DO,E.FORM,-,-)(DO,E.FORM,-,-)S S的中间代码的中间代码(ENDWHILE,-,-,-)(ENDWHILE,-,-,-)P183-5 试写出下述程序段的目标代码,其中变量均为非形参实型变量。while (x 0)y=y-x;else while (y 0)y=y-x;else while(y 0)y=y+x;的中间代码的中间代码(ENDWHILE,-,-,-)(ENDWHILE,-,-,-)中间代码结构:中间代码结构:(WHILE,-,-,-)(WHILE,-,-,-)x 0)y=y-x;else while(y 0)y=y+x;的中间代码的中间代码(ENDWHILE,-,-,-)(ENDWHILE,-,-,-)if E then Sif E then S1 1 else S else S2 2中间代码结构中间代码结构:E E 的中间代码的中间代码(THEN,E.FORM,(THEN,E.FORM,)S S1 的中间代码的中间代码(ELSE,(ELSE,)S S2 的中间代码的中间代码(ENDIF,(ENDIF,)中间代码结构中间代码结构(WHILE,)(LT,x,y,t1)(DO,t1,)(ADDF,y,1,t2)(ASSIG,t2,2,y)(GT,y,0,t3 3)(THEN,t3 3,-,-)y=y-x的中间代码的中间代码(ELSE,-,-,-)while(y 0)y=y-x;else while(y 0)y=y+x;的中间代码的中间代码(ENDWHILE,-,-,-)(ENDWHILE,-,-,-)中间代码结构中间代码结构(WHILE,-,-,-)(LT,x,y,t1)(DO,t1,-,-)(ADDF,y,1,t2)(ASSIG,t2,2,y)(GT,y,0,t3)(THEN,t3,-,-)(SUBF,y,x,t4)(ASSIG,t4,2,y)(ELSE,-,-,-)(WHILE,-,-,-)(LT,y,0,t5)(DO,t5,-,-)(ADDF,y,x,t6)(ASSIG,t6,2,y)(ENDWHILE,-,-,-)(ENDIF,-,-,-)(ENDWHILE,-,-,-)中间代码结构中间代码结构(WHILE,)(LT,x,y,t1)(DO,t1,)(ADDF,y,1,t2)(ASSIG,t2,2,y)(GT,y,0,t3)(THEN,t3,-,-)y=y-x的中间代码的中间代码(ELSE,-,-,-)while(y 0)y=y+x;的中间代码的中间代码 (ENDIF,_,_)(ENDWHILE,)目标代码目标代码1.LD R,x 2.LT R,y3.ST t1,R4.LD R,t15.JMP0 R,?6.LD R,y7.ADD R,18.ST t2,RLD R,t21.ST y,R2.LD R,y3.GT R,04.ST t3,R14.LD R,t315.JMP0 R,?16.LD R,y17.SUB R,x18.ST t4,R19.LD R,t420.ST y,R21.JMP?LD R,y14.LT R,015.ST t5,R16.LD R,t517.JMP0 R,?27.LD R,y28.ADD R,x29.ST t6,R30.LD R,t631.ST y,R32.JMP?33.JMP中间代码结构中间代码结构(WHILE,-,-,-)(LT,x,y,t1)(DO,t1,-,-)(ADDF,y,1,t2)(ASSIG,t2,2,y)(GT,y,0,t3)(THEN,t3,-,-)(SUBF,y,x,t4)(ASSIG,t4,2,y)(ELSE,-,-,-)(WHILE,-,-,-)(LT,y,0,t5)(DO,t5,-,-)(ADDF,y,x,t6)(ASSIG,t6,2,y)(ENDWHILE,-,-,-)(ENDIF,-,-,-)(ENDWHILE,-,-,-)221 3333223412252615 21 WHILE(Q)IFWHILE(S)14.LD R,t315.JMP0 R,22 16.LD R,y17.SUB R,x18.ST t4,R19.LD R,t420.ST y,R21.JMP 3322.LD R,yLT R,014.ST t5,R15.LD R,t516.JMP0 R,3327.LD R,y28.ADD R,x29.ST t6,R30.LD R,t631.ST y,R32.JMP 22 33.JMP 1134目标代码目标代码1.LD R,x 2.LT R,y3.ST t1,R4.LD R,t15.JMP0 R,34 6.LD R,y7.ADD R,18.ST t2,RLD R,t21.ST y,R2.LD R,y3.GT R,04.ST t3,Rwhile (x 0)y=y-x;else while (y 0)y=y+x;10.4.6 10.4.6 标号语句四元式和标号语句四元式和gotogoto语句的四语句的四元式翻译成目标代码元式翻译成目标代码标号定位语句标号定位语句的一般形式为:的一般形式为:L:语句语句它所对应的四元式为:它所对应的四元式为:(LABEL,_,_,LLi)语句的四元式语句的四元式 该四元式不产生目标代码,该四元式不产生目标代码,只需只需向向L所分配到所分配到的存储单元的存储单元LLi写入转向地址。设当前可用地址为写入转向地址。设当前可用地址为A,则将地址,则将地址A写入写入L所分配到的存储单元所分配到的存储单元LLi.(LABEL,_,_,LLi)四元式对应的目标代码四元式对应的目标代码goto语句语句的一般形式为:的一般形式为:goto L 它所对应的四元式为:它所对应的四元式为:(JMP,_,_,LLi)它所生成的目标代码为它所生成的目标代码为:JMP *LLil有些指令既可以放到入口处,又可以放到调用有些指令既可以放到入口处,又可以放到调用处:如填写动态链。处:如填写动态链。l有些指令只能放到调用处,如返回地址。有些指令只能放到调用处,如返回地址。l有些指令放到入口处还是放到调用处依据是否有些指令放到入口处还是放到调用处依据是否保留符号表而定;如:生成活动记录保留符号表而定;如:生成活动记录栈顶栈顶指令。指令。l一条指令的不同位置,可以影响其他指令使用一条指令的不同位置,可以影响其他指令使用的寄存器不同,如:有时需用的寄存器不同,如:有时需用top有时需用有时需用sp,依赖新依赖新AR的的sp在入口处还是调用处修改的。在入口处还是调用处修改的。10.4.7 过程、函数说明语句四元式的翻译(保留符号表至目标代码生成部分)l过程和函数的说明语句分包括口语句和出口语句。l过程和函数说明的入口语句所对应的四元式为:(ENTRY,Q,_,_)其中Q为过程名或函数名的符号表地址。NameNameForwardForwardSizeSizeClassClassParmParmLevelLevelKindKindTypePtrTypePtroffoffCodeCode 对此四元式可以不产生任何目标代码,只需将当前指令地址A填入Q的语义信息的code项中,即 A sem(Q).code。l过程和函数说明语句的出口部分所对应的四元式分别为:1(ENDPROC,_,_)2(ENDFUNC,_,_)这两条四元式的处理过程基本上是相同的,此处要完成的工作包括:1.将本层活动记录中保存的机器状态恢复过来,对应一组读指令,因为不同的机器需要保存的信息不同,所以这里省略了这部分的代码;NIL动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针动态链(控制链)指针sptoptopsp 返回地址返回地址2.删除本层活动记录,使动态外层的活动记录成为当前活动记录;ST top,sp LD sp,0(top)/作废当前活动记录3.按1(top)中记载的返回地址返回。JMP *1(top)/按返回地址返回 10.4.8 过程和函数调用语句四元式的翻译过程和函数调用语句四元式的翻译(保留符号表至目标代码生成部分)l过程和函数调用语句四元式结构过程和函数调用语句四元式结构E E1 1 的中间代码的中间代码.E En n 的中间代码的中间代码(VarACT/ValACT,t(VarACT/ValACT,t1 1,Offset,Offset1 1,Size,Size1 1).(VarACT/ValACT,t(VarACT/ValACT,tn n ,Offset ,Offsetn n,Size,Sizen n)(CALL,true/false,Result )(CALL,true/false,Result )实参表达式的计算实参表达式的计算实参的计算实参的计算结果传递到结果传递到相应的形参相应的形参变量变量调用过程调用过程/函数函数体执行体执行l传传参四元式的翻参四元式的翻译译 函数的形式参数又可分为值参、变参及函数的形式参数又可分为值参、变参及过过/函参数。过函参数。过/函参数的处理较复杂,因此只函参数的处理较复杂,因此只讨论值参和变参两种情形。讨论值参和变参两种情形。1 1t t对应的形式参数为值参时的传参四元式对应的形式参数为值参时的传参四元式结构为:结构为:(ValACTValACT,t,Offset,size),t,Offset,size)2 2t t对应的形式参数为变参时的传参四元式对应的形式参数为变参时的传参四元式结构为:结构为:(VarACTVarACT,t,Offset,size),t,Offset,size)l值值参四元式参四元式(ValACT,t,Offset,size)的翻的翻译译该情形又可以分为以下几种情况:该情形又可以分为以下几种情况:a.若若t为间接变量,则生成的目标代码为:为间接变量,则生成的目标代码为:LD R,*tST Offset(top),Rb.若若t 为直接变量,则生成的目标代码为:为直接变量,则生成的目标代码为:LD R,t ST Offset(top),R c.若若t 为数组,则生成成组传送的目标代码:为数组,则生成成组传送的目标代码:a.MOVEB t,Offset(top),size l 变参四元式变参四元式(VarACT,t,Offset,size)的翻译的翻译的翻译的翻译这种情形又可以分为以下几种情况:这种情形又可以分为以下几种情况:a.若若t为直接变量,则生成的目标代码为:为直接变量,则生成的目标代码为:LEA R,tST offset(top),Rb.若若t为间接变量,则生成的目标代码为:为间接变量,则生成的目标代码为:LD R,t ST offset(top),Ra.生成填写变量访问环境的指令。根据变量访问环境的不同实现方式,例如局部Display表、全局Display表和静态链,生成相应的指令。b.把机器状态(寄存器内容)保存到活动记录的机器状态区中,一般应生成一组存的指令。l过过/函调用四元式的翻译函调用四元式的翻译(CALL,f,true,Result )c.要填写管理信息,首先填写过程层数。从过程f的语义信息中取其层数,填入到2(top)中,生成指令为:LD R,semf.levelST 2(top),Rd.填写动态链指针:ST 0(top),spe.填写返回地址:LD R,A+5 /AST 1(top),R /A+1 f.生成过程活动记录:ST sp,top/A+2ST top,(semf.size)top /A+3g.生成转向过程f入口的指令:JMP semf.code /A+4h.(调用返回时)如果是函数调用,则把函数值读回:LD R,4(top)/假定返回值存放在4(top)中,A+5ST result,R (return,-,-,t)的翻译:LD R,t/*t ST 4(top),Rh.d-e.如果是函数调用,可以不需第h步骤,则把存放函数返回值的i.地址读到AR中:LEA R,result/假定返回值存放在4(top)中ST 4(top),R (return,-,-,t):LD R,t ST *4(top),R

    注意事项

    本文(编译原理第十章.ppt)为本站会员(s****8)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开