编译原理及实现技术课件:第十章 目标代码生成_第1页
编译原理及实现技术课件:第十章 目标代码生成_第2页
编译原理及实现技术课件:第十章 目标代码生成_第3页
编译原理及实现技术课件:第十章 目标代码生成_第4页
编译原理及实现技术课件:第十章 目标代码生成_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十章 目标代码生成内容基本概念寄存器分配目标代码生成实例小结目标代码vs.中间代码目标代码中间代码代码形式具体实现的机器码程序逻辑的直接翻译地址形式绝对地址相对地址是否产生额外代码对AR的管理代码返回值处理无目标代码实际目标代码:实际机器上的指令序列。绝对地址机器代码:执行效率高、可移植性差可重定位的机器代码:需要连接器装配汇编代码:可移植性好、需要经过汇编转换虚拟目标代码:虚拟机上的目标程序。在本地机器上具备虚拟机的解释器。寻址模式与寄存器分配指令格式:Op R #C(立即数-寄存器)Op R2 d(R1) (存储器-寄存器)Op R1 R2 (寄存器-寄存器)寄存器分配 :代价:访问内存

2、的次数模式:单寄存器模式、多寄存器模式原则:优先分配;活跃驻留;多载附录1:80X86汇编指令一、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。二、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。三、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。四、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。五、串操作指令:MOVS

3、、LODS、STOS、CMPS、SCAS。六、标志处理指令:CLC、STC、CLD、STD。附录2:虚拟机指令系统指令名称指令形式指令名称指令形式读IN R除DIV R, A写OUT R条件真转移JMP1 R, A取值LD R, A条件假转移JMP0 R, A存值ST A, R无条件转移JMP A加ADD R, A取址LEA R, A减SUB R, A块传送MOVEB A1, A2, S乘MULT R, A表达式和赋值语句的翻译形如(Op,A,B,T):LD R,A;Op R,B形如(ASSIG,A,B):LD R,A;ST B,R例:Z:= X*(a+b)* Y* (a+b) (,a,b,t

4、1)LD R,a; Add R,b(*,X,t1,t2)ST R,t1; Mult R, X(*,t2,Y,t3)Mult R,Y(*,t3,t1,t4)Mult R,t1输入/输出语句的翻译输入语句:(READ,-,-, A)IN R ST A , R输出语句:(WRITE,-,-,A)LD R , AOUT R 条件语句四元式的翻译(THEN, t,_ , _)生成的目标代码为:LD R , tJMP0 R , _(ELSE,_,_,_)生成的目标代码为:JMP _ 同时回填JUMP0指令的目的地址(ENDIF,_,_,_)不产生目标代码,只负责完成ELSE子句的地址回填工作 。循环语句的

5、翻译(WHILE,_,_,_)不产生目标代码,只用来标记while语句的入口地址。(DO , t ,_ ,_)产生的目标代码为:LD R , tJMP0 R , _(ENDWHILE, _, _, _)产生的目标代码:JMP A 回填前面DO四元式所产生的半条指令 标号和goto语句的翻译(LABEL, _, _,L)不产生目标代码,只向L所分配到的存储单元写入转向地址。 (GOTO, _, _, L)生成的目标代码为JMP *L过程、函数说明的翻译(ENTRY, Q, , ) 不产生目标代码,只需将当前指令地址A填入Q的相应语义信息中。(ENDPROC, ,)或(ENDFUNC,) 1. 将

6、本层活动记录中保存的机器状态恢复过来,对应一组读指令。2. 删除本层活动记录,使动态外层的活动记录成为当前活动记录;3. 按1(top)中记载的返回地址返回。目标代码为: ST top, sp LD sp , 0(top) / 作废当前活动记录 JMP 1(top) /按返回地址返回 过程、函数调用语句的翻译值参情形 (ValACT , t , Offset , size )a.若t为直接变量 ,则生成的目标代码为: LD R ,t ST offset(sp) , R b.若t为间接变量,则生成的目标代码为:LD R , * tST offset(sp) , R c.若t为数组,则生成的目标代

7、码为:MOVEB t , offset(sp) , size 过程、函数调用语句的翻译变参情形 (VarACT , t, Offset , size )a. 若t为直接变量,则生成的目标代码为:LEA R , tST offset(sp) , Rb. 若t为间接变量,则生成的目标代码为:LD R , t ST offset(sp) , R 过程、函数调用语句的翻译过程、函数调用语句 (CALL , f , , t ) 1. 生成填写变量访问环境指令2. 把机器状态(寄存器内容)保存到活动记录的机器状态区中,一般应生成一组存的指令3. 要填写管理信息.首先填写过程层数.从过程f的语义信息中取其层

8、数,填入到2(top)中,生成指令为LD R , semf.levelST 2(top), R4. 填写动态链指针ST 0(top), sp5. 填写返回地址LD R, A+5 / AST 1(top), R / A+1 6. 生成过程活动记录ST sp, top / A +2ST top, top + semf.size/ A+37. 生成转向过程f入口的指令JMP semf.code / A+48. 如果是函数调用,则把函数值读到寄存器中LD R , 2(top) / A+5ST t , R 实例const int n = 5;int sum = 0;int fac(int i)if(i=

9、0)return 1;if(i0)return -1;return(i*fac(i-1);main()sum=fac(5);库代码目标代码静态区栈区堆区内存状态库代码目标代码静态区栈区堆区动态链指针返回地址返回值空间大小AR(main)AR(fac)形参变量局部变量临时变量(ASSIGN,0,1,sum)(ENTRY,fac,2,0)(EQ, i, 0, t1)(JMP0, _,_, L2)(RETURN, _, _, 1)(LABEL, _, _, L2)(LT, i, 0, t1)(JMP0, _,_, L3)(RETURN, _, _, -1)(LABEL, _, _, L3)(-, i

10、, 1, t2)(VALACT, t2,0, 1)(CALL,fac,true, t3)(*, i, t3, t4)(RETURN, _, _, t4)(ENDFUNC, _, _ , _)(ENTRY, L4, 1 , 0)(VALACT,n,0, 1)(CALL,fac,true,t5)(ASSIGN,t5,_, sum)(ENDFUNC, _, _ , _)内存状态库代码目标代码静态区栈区堆区&AR(main)?&t16AR(main)AR(fac)it1/t2/t3/t4/t5(ASSIGN,0,1,sum)(ENTRY,fac,2,0)(EQ, i, 0, t1)(JMP0,t1,_

11、,L2)(RETURN,_,_,1)(LABEL,_,_,L2)(LT, i, 0, t1)(JMP0,t1,_, L3)(RETURN,_,_,-1)(LABEL,_,_,L3)(-, i, 1, t2)LD R,#0ST 0gp, RJMP _40_LD 0top,spLD sp,topADD top,#6LD R 4spEQ R,0ST 5sp,RJMP0 R,_14_LD R,#1ST *2sp,RJMP _36_LD R 4spLT R,0ST 5sp,RJMP0 R,_20_LD R,#-1ST *2sp,RJMP _36_LD R 4spSUB R,1ST 5sp,R(ASSIG

12、N,0,1,sum)(ENTRY,fac,2,0)(EQ, i, 0, t1)(JMP0,t1,_, L2)(RETURN,_,_,1)(LABEL,_,_,L2)(LT, i, 0, t1)(JMP0,t1,_, L3)(RETURN,_,_,-1)(LABEL,_,_,L3)(-, i, 1, t2)(VALACT,t2,0,1)(CALL,fac,true,t3)(*, i, t3, t4)(RETURN,_,_,t4)(ENDFUNC,_,_,_)(ENTRY,L4,1,0)(VALACT,n,0,1)(CALL,fac,true,t5)(ASSIGN,t5,_,sum)(ENDFUN

13、C,_,_,_)LD R,5spST 4top,RLEA R,5spST 2top,RLD 1top,pc+2?JMP _4_LD R,5spMUL R,4spST 5sp,RLD R,5spST *2sp,RJMP _36_(VALACT,t2,0,1)(CALL,fac,true,t3)(*, i, t3, t4)(RETURN,_,_,t4)(ENDFUNC,_,_,_)(ENTRY,L4,1,0)(VALACT,n,0,1)(CALL,fac,true,t5)(ASSIGN,t5,_,sum)(ENDFUNC,_,_,_)LD top,spLD sp,0spLD R,1topJMP RLD 0top,spLD sp,topADD top,5LD 4sp,#5LEA R,5spST 2top,RLD 1top,pc+2?JMP _4_内存状态库代码目标代码静态区栈区堆区?&t15AR(main)AR(fac)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论