第十章 目标代码生成

13
第第第 第第第第第第 第第第 第第第第第第

Upload: george-massey

Post on 01-Jan-2016

39 views

Category:

Documents


2 download

DESCRIPTION

第十章 目标代码生成. 目标代码. 虚拟目标代码: 虚拟机上的目标程序。 在本地机器上具备虚拟机的解释器。 实际目标代码: 实际机器上的指令序列 绝对地址机器代码: 可重定位的机器代码: 汇编代码:. 三种硬件地址模式. 指令格式: Op R #C ( 立即-----寄存器) Op R2 d(R1) ( 存储器-----寄存器) Op R1 R2 ( 寄存器-----寄存器) 几个常见指令的含义 : LD R Source 从 Source 读出送入 R - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第十章 目标代码生成

第十章 目标代码生成第十章 目标代码生成

Page 2: 第十章 目标代码生成

目标代码目标代码

虚拟目标代码:虚拟机上的目标程序。

在本地机器上具备虚拟机的解释器。

实际目标代码:实际机器上的指令序列

绝对地址机器代码:

可重定位的机器代码:

汇编代码:

Page 3: 第十章 目标代码生成

三种硬件地址模式三种硬件地址模式 指令格式: Op R #C (立即 ----- 寄存器)

Op R2 d(R1) (存储器 ----- 寄存器)

Op R1 R2 (寄存器 ----- 寄存器) 几个常见指令的含义 : LD R Source 从 Source 读出送入 R Op R Source Source op R 结果 送入 R ST Target R R 的内容送入 Target.

Page 4: 第十章 目标代码生成

表达式和赋值语句的翻译表达式和赋值语句的翻译 形如( 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,t1)

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

Page 5: 第十章 目标代码生成

输入输入 // 输出语句的翻译输出语句的翻译

输入语句:( READ , A )IN R

ST A , R

输出语句:( WRITE , A )LD R , A

OUT R

Page 6: 第十章 目标代码生成

条件语句四元式的翻译条件语句四元式的翻译( THEN, t,_ , _ )生成的目标代码为:

LD R , t

JUMP0 R , __( ELSE,_,_,_ )生成的目标代码为:

JMP __

同时回填 JUMP0 指令的目的地址

( ENDIF,_,_,_ )不产生目标代码,只负责完成 ELSE 子句的地址回填工作 。

Page 7: 第十章 目标代码生成

循环语句的翻译循环语句的翻译

( WHILE,_,_,_ )不产生目标代码,只用来标记while 语句的入口地址。

( DO , t ,_ ,_ )产生的目标代码为:LD R , tJUMP0 R , _

( ENDWHILE, _, _, _ )产生的目标代码:JMP A 回填前面 DO 四元式所产生的半条指令

Page 8: 第十章 目标代码生成

标号和标号和 gotogoto 语句的翻译语句的翻译

( LABEL, _, _,L )不产生目标代码,只向 L所分配到的存储单元写入转向地址。

( GOTO, _, _, L )生成的目标代码为JMP *L

Page 9: 第十章 目标代码生成

过程、函数说明的翻译过程、函数说明的翻译 ( ENTRY, Q, —, —) 不产生目标代码,只需将当前

指令地址 A 填入 Q 的相应语义信息中。

(ENDPROC, —,—,—) 或 (ENDFUNC,—,—,—) 1. 将本层活动记录中保存的机器状态恢复过来,对应一组读指令。2. 删除本层活动记录,使动态外层的活动记录成为当前活动记录;3. 按 1 ( top )中记载的返回地址返回。目标代码为 :

ST top, sp LD sp , 0(top) // 作废当前活动记录

JMP 1(top) // 按返回地址返回

Page 10: 第十章 目标代码生成

过程、函数调用语句的翻译过程、函数调用语句的翻译 值参情形 (ValACT , t , Offset , size )

a. 若 t 为间接变量,则生成的目标代码为:LD R , * t

ST offset ( sp ) , R

b. 若 t 为直接变量 ,则生成的目标代码为: LD R ,t

ST offset ( sp ) , R

c. 若 t 为数组,则生成的目标代码为:moveB t , offset ( sp ) , size

Page 11: 第十章 目标代码生成

变参情形 (VarACT , t, Offset , size )

a. 若 t 为直接变量,,则生成的目标代码为:LEA R , t

ST offset ( sp ) , R

b. 若 t 为间接变量 , ,则生成的目标代码为:LD R , t

ST offset ( sp ) , R

过程、函数调用语句的翻译过程、函数调用语句的翻译

Page 12: 第十章 目标代码生成

过程、函数调用语句 (CALL , f , —, t )

1. 生成填写变量访问环境指令2. 把机器状态 ( 寄存器内容 ) 保存到活动记录的机器状态区中 , 一般应生成一组存的指令3. 要填写管理信息 . 首先填写过程层数 . 从过程 f的语义信息中取其层数 , 填入到 2 ( top )中 , 生成指令为

LD R , sem[f].level

ST 2(top), R

过程、函数调用语句的翻译过程、函数调用语句的翻译

Page 13: 第十章 目标代码生成

4. 填写动态链指针ST 0(top), sp

5. 填写返回地址LD R, A+5 // AST 1(top), R // A+1

6. 生成过程活动记录ST sp, top // A +2ST top, top + sem[f].size // A+3

7. 生成转向过程 f 入口的指令JMP sem[f].code // A+4

8. 如果是函数调用,则把函数值读到寄存器中LD R , 4(top) // A+5ST t , R