第 12 章 代码生成

44
12 12 第第第第 第第第第

Upload: willow

Post on 11-Jan-2016

70 views

Category:

Documents


6 download

DESCRIPTION

第 12 章 代码生成. 种类. ω R, A. 意义. 存取. ST R, A LD R, A. (R)  addr[A] (addr[A])  R. 12.1 目标机. 目标代码分为两类 : 一是机器语言代码 一是汇编语言代码 一、有代表性的目标机 二、具体指令系统. 实 数 运 算. ADD R, A SUB R, A MUL R, A DIV R, A. (R)ω(addr(A))  R. 整数 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 12 章  代码生成

第第 1212 章 代码生成章 代码生成第第 1212 章 代码生成章 代码生成

Page 2: 第 12 章  代码生成

12.1 目标机目标代码分为两类 :一是机器语言代码 一是汇编语言代码一、有代表性的目标机二、具体指令系统

(R)addr[A] (addr[A])R

ST R, A LD R, A

存取 意义 ω R, A 种类

Page 3: 第 12 章  代码生成

(R)ω(addr(A)) R

IADD R, A ISUB R, A IMUL R, A

整数运算

(R)ω(addr(A)) R

AND R, A OR R, A

逻辑运算

(R)ω(addr(A)) R

ADD R, ASUB R, AMUL R, A DIV R, A

实数运算

Page 4: 第 12 章  代码生成

Real(addr[A])R CONV R, A 转实

(R)=true 则 转 addr[A], 否则下一条 (R)=false 则转 addr[A], 否则下一条无条件转向 addr[A]

TJMP R, A FJMP R, A JMP R, A

转向操作

(R)ω(addr[A])成立,则 trueR,否则 falseR

LT R, ALE R, AEQ R, A GT R, AGE R, A

关系运算

Page 5: 第 12 章  代码生成

Addr[A]R LDA R, A

读出地址

(R)+MR RINC R, M

变址器加

例子:假设有函数说明FUNCTION f(VAR X:real;J:integer):real;BEGIN X:=2.5+J IF X>2.5 THEN X:=X+1 ELSE X:=X-1.0; f:=X*YEND

Page 6: 第 12 章  代码生成

则生成的四元式为 (当前层数 l-1): 1.(FUNC,f, Noff,Moff) 2.(CONV,J, —, T1 ) 3.(r+, 2.5, T1, T2 ) 2.5+J 4.(=:, T2, —, X ) X:=2.5+J 5.(>, X, 2.5, T3 ) X>2.5 4.(THEN,T3, —, —) 5.(CONV,1, —, T4) 6.(r+, X, T4, T5) X+1 7.(=:, T5, —, X ) X:=X+1 8.(ELSE,—, —, —)

Page 7: 第 12 章  代码生成

9.(r-, X,1.0,T6) X-1.0 10.(=:, T6,—, X) X:=X-1.0 11.(IFEND,—,—,—) 12.(r*, X, Y, T7) X*Y 13.(=:, T7,—, f) f:=X*Y 14.(FUNED,—,—,—)

引用型形参变量是间接变量 ,因此要用间接地址法 .从上面中间代码生成出来的目标代码如下 : 1.ST ф,2[top] 存返回地址

Page 8: 第 12 章  代码生成

2.JMP —, DISPLAY 形成 DISPLAY 表 3.- l', l (top)sp 4.ST top, sp (top)+Moftop 5.RINC top, Moff 6.CONV R1, J 7.ADD R1, 2.5 8.ST R1, *X 9.LD R1, *x10.GT R1, 2.511.FJMP R1, ⒃12.CONV R1, 113.ADD R1, *x

Page 9: 第 12 章  代码生成

14.ST R1, *x15.JMP —, ⒆16.LD R1, *X17.SUB R1, 1.018.ST R1, *x19.LD R1, *X20.MUL R1, y21.ST R1, 3[sp]22.ST SP, top (sp)top23.LD SP, 0[top] (0[top])sp24.JMP —, 2[top] 返回

Page 10: 第 12 章  代码生成

在本例中 ,标示符的抽象地址和目标地址如下 :

(i,k[sp]) (l',i) y

5[sp] (l,5) J

4[sp] (l,4) X

3[sp] (l,3) f

目标地址 抽象地址 标示符

其中 k=6+l'

Page 11: 第 12 章  代码生成

指令 2转向子程序 DISPLAY 。它把指令 3作为信息做下面工作 ( 造本层 DISPLAY 表 )并返回到指令 4:

1.0 i 2.(addr(i,2[top]))(i+6)[top] 3.i+1i 4. 若 i≤l则转 2 5.(sp)(6+l)[top]

Page 12: 第 12 章  代码生成

12.2 寄存器分配定义访问一次内存的代价为,则指

令执行代价 =访问内存次数 +1 例如 : 1. DL R0,M MUL R0,R0 总代价 =4 ADD R0,R0

2. DL R0,M ADD R0,M 总代价 =6 ST R0,M

Page 13: 第 12 章  代码生成

3. DL R0,M MUL R0,R1 总代价 =7 ST R0,M其中 M表示直接存储地址。

Page 14: 第 12 章  代码生成

使用寄存器的主要思想 在目标代码中使用寄存器的主要思想是:在四元式中,每当一个变量被定义时,首先产生把值送入某一寄存器的目标代码,然后在一个表里注明该变量的值在哪一寄存器中,只有当寄存器被剥夺且变量的值以后还有用时,才把寄存器中的现行值记入内存单元。当一个变量的值以后不再被引用时,就不必保存到内存中。

Page 15: 第 12 章  代码生成

寄存器的分配以基本块为单位。在基本块开始时所有寄存器都是空闲可用的,在结束基本块时剥夺所有寄存器,以便在下一个基本块开始时所有寄存器都是可用的。

Page 16: 第 12 章  代码生成

寄存器分配的中心问题有二:一是寄存器的主动释放问题,一是寄存器的剥夺(被迫释放)问题。当没有可主动释放的,又没有空闲可用的寄存器时要采取剥夺手段。两个中心问题中的主要问题是寄存器的剥夺问题。

决定剥夺哪个的主要因素有下列一些: 1.写入内存次数。 2.下次使用点的距离。 3.使用频率。

Page 17: 第 12 章  代码生成

每当一个寄存器被剥夺时,要把它的值写入一些内存单元中,我们希望这种写入动作最少。不同寄存器中的值在一个基本块内的使用频率是不相同的,我们希望被剥夺者(值)的使用频率是最低的。我们也希望被剥夺者的下次使用点是最远的。

Page 18: 第 12 章  代码生成

12.3 表达式四元式的翻译 [ 例 ] 设有表达式 X*(a+b)*Y*(a+b) 其中 X和 Y为间接量, a和 b为直接量,且类型均为实型,则生成的四元式为:

1. (r+, a, b, T1) 2. (r*, X, T1, T2) 3. (r*, T2, Y, T3) 4. (r*, T3, T1, T4)

Page 19: 第 12 章  代码生成

由上述四元式生成目标代码的过程如图所示 四 元 式 目 标 代 码 REGALLOC 表 r+ ,a,b,T1

LD R1, a ADD R1, b

1. (T1, R1, 0, 2, 2)

r*,X,T1,T2

LD R2, *X MUL R2, R1

1. (T1, R1, 0, 4, 1)2. (T2, R2, 0, 3, 1)

r*,T2,Y,T3

MUL R2, *Y

1. (T1, R1, 0, 4, 1)2. (T3, R2, 0, 4, 1)

r*,T3,T1,T4

MUL R2, R1

1. (T4, R2, 0, -, -)

Page 20: 第 12 章  代码生成

12.4 复合变量四元式的翻译 复合变量有两种: V[E] , V.I 。其中 V有两

种可能:第一,它是结构变量名,第二,它又 是一个复合变量。结构变量名又可分为形参名 和实在名。

V[E] 变量的四元式(最后一条)可有以下三类: Ⅰ. ([ ], a, T0, T) Ⅱ. ([ ], A, T0, T) Ⅲ. ([ ], Tv, T0, T)

Page 21: 第 12 章  代码生成

上述四元式对应的目标代码分别为: Ⅰ. LDA Φ, addr(a) IADD Φ, loca(T0) ST Φ, addr(T)Ⅱ. LD Φ, addr(A) IADD Φ, loca(T0) ST Φ, addr(T)Ⅲ. LD Φ, addr(Tv) IADD Φ, loca(T0) ST Φ, addr(T)

Page 22: 第 12 章  代码生成

V.I 的四元式有以下三类: Ⅰ. (·, rc, I’, T) Ⅱ. (·, RC, I’, T) Ⅲ. (·, Tv, I’, T)

其中 I’在处理上可能有两种:一是 I’为域名 I自身(名表地址),一是 I’为 SYMBL 表地址。我们需要的是 I的 OFF 值。

Page 23: 第 12 章  代码生成

上述三种四元式的目标代码分别如下:

Ⅰ. LDA Φ , addr(rc) RINC Φ , off(I) ST Φ , addr(T)Ⅱ. LD Φ , addr(RC) RINC Φ , off(I) ST Φ , addr(T)Ⅲ. LD Φ , addr(Tv) RINC Φ , off(I) ST Φ , addr(T)

Page 24: 第 12 章  代码生成

[ 例 ] 设有表达式 a[i*2+1]*B[i*2].u 和说明

VAR i, j: integer; u: real; a: ARRAY[1…10] OF real; 以及形参说明 VAR B : Tname ,其中 Tname表示前面数组类型的名,则生成的四元式和目标代码分别如下:

Page 25: 第 12 章  代码生成

四元式 1. ( i*, i, 2, T1 )

2. ( i+, T1, 1, T2 )

3. ( i-, T2, 1, T3 )

4. ( [ ], a, T3, T4 )

5. ( i-, T1, 1, T5 )

6. ( [ ], B, T5, T6 )

7. ( · , T6, u, T7 )

8. ( r*, T4, T7, T8 )

Page 26: 第 12 章  代码生成

目标代码 1. LD R1, I 2. IMUL R1, 2 3. LD R2, R1 4. IADD R2, 1 5. ISUB R2, 1 6. LDA Φ, a 7. IADD Φ, R2 8. ST Φ, T4 9. ISUB R1, 1

10. LD Φ, B 11. IADD Φ, R1 12. ST Φ, T6 13. LD Φ, T6 14. RINC Φ,off(u) 15. ST Φ, T7 16. LD R1, *T4 17. MUL R1, *T7

Page 27: 第 12 章  代码生成

12.5 赋值四元式的翻译 赋值语句可分为以下三种: Ⅰ. V0: =E Ⅱ. V1: =V2 Ⅲ. f: =E 其中 V0 表示简单类型的变量, V1和 V2 是结构类型的变量, f为实在函数名。对应的赋值四元式分别为:

Ⅰ. (=: , eres(E), ——, vres(V0)) Ⅱ. (=: , vres(V2), ——, vres(V1)) Ⅲ. (=: , eres(E), ——, vres(f))

Page 28: 第 12 章  代码生成

[ 例 ] 设有程序段 u: = i*j; X: = 0; W: = i*j+u 且变量均为整型变量, X为引用型形参变量,则因公共表达式节省是以基本块为单位的,而 X:=0 是一个块的结束(在生成四元式时),因此首先生成如下四元式:

Page 29: 第 12 章  代码生成

1. (i*, i, j, T1) 2. (=:, T1, —, u) 3. (=:, 0, —, X) 4. (i*, i, j, T2) 5. (i+, T2, u, T3) 6. (=:, T3, —, w)

Page 30: 第 12 章  代码生成

当处理完四元式 1, 2时得到目标代码

和 REGALLOC 表:

REGALLOC[u]=(R1, 5, 1)

1. LD R1, i 2. IMUL R1, j

Page 31: 第 12 章  代码生成

当处理四元式 3时,首先生成目标代码 3. LD R2, 0 4. ST R2, *X 然后调用 REGSTORE 子程序,它将生成把寄

存器中的值送回内存(如果必要的话)的目标代码:

5. ST R1, u

Page 32: 第 12 章  代码生成

并把 REGALLOC 表置成空。这样四元式 5中的 u不能引用寄存器中的 u值。后面的目标代码如下:

6. LD R1, i 7. IMUL R1, j 8. IADD R1, u

REGALLOC[w] =(R1,— ,— )

Page 33: 第 12 章  代码生成

如果四元式 9 是新块的入口四元式,则当前基本块结束,它将会首先生成下面的目标代码:

9. ST R1 , w

并把 REGALLOC 表置成空。

Page 34: 第 12 章  代码生成

12.6 条件语句四元式的翻译 这里说的条件语句四元式主要指以下三种: Ⅰ. (THEN, A, ——,—— ) Ⅱ. (ELSE, ——,——,—— ) Ⅲ. (IFEND,——,——,—— ) 其中最后一条不产生目标代码,只完成回填工作。前二种四元式生成的目标代码形如:

Ⅰ. LD R, loca(A) FJMP R, Jaddr Ⅱ. JMP ——, Jaddr 其中 Jaddr 是转向地址。

Page 35: 第 12 章  代码生成

[ 例 ] 设有条件语句 IF x>0 THEN BEGIN x:=0;y:=1 END ELSE BEGIN x:=1;y:=0 END则生成的四元式为:

1. ( >, x, 0, T1 ) 2. ( THEN, T1, —, — ) 3. ( =:, 0, — , x ) 4. ( =:, 1, —, y ) 5. ( ELSE, —, —, — ) 6. ( =:, 1, —, x ) 7. ( =:, 0, —, y ) 8. (IFEND, —, —, — )

Page 36: 第 12 章  代码生成

最后生成的目标代码为: P+1. LD R1, x 2. GT R1, 0 3. FJMP R1, P+9 4. LD R1, 0 5. LD R2, 1 6. ST R1, x 7. ST R2, y 8. JMP — , P+13 9. LD R1, 1 10. LD R2, 0 11. ST R1, x 12. ST R2, y

Page 37: 第 12 章  代码生成

12.7 循环语句四元式的翻译 循环语句四元式指下面三种四元式(只考虑 WHILE循环):

Ⅰ. (WHILE, —, — , — ) Ⅱ. (DO, A, — , — ) Ⅲ. (WHEND, — , — , — ) 其中 WHILE 四元式不产生目标代码,只用于记住 WHILE循环的入口(重复)地址, DO四元式将产生条件转移目标代码,其转移地址要回填, WHEND 四元式将产生无条件转向循环头的目标代码,同时回填 DO 四元式所产生的条件转移代码中的转向地址。

Page 38: 第 12 章  代码生成

Ⅰ. WHILE 四元式: REGSTORE ; PUSH(P+1)

Ⅱ. DO 四元式:同于 THEN 四元式Ⅲ. WHEND 四元式: 1. REGSTORE 2. POP(P’); BACK(P’,P+2) 3. POP(P’);CODE(JMP,—,P’)

Page 39: 第 12 章  代码生成

12.8 转向语句和标号四元式的翻译

考虑的四四元式为:Ⅰ. (LABEL ,——,——, l)Ⅱ. (GOTO, ——,——, l)翻译略

Page 40: 第 12 章  代码生成

12.9 过程、函数说明四元式的翻译

考虑的四元式为Ⅰ. (PROC, f, Noff, Moff)Ⅱ. (FUNC, g, Noff, Moff)Ⅲ. (PROCEND, — , — , — )Ⅳ. (FUNCEND, — , — , — )

其中Ⅰ和Ⅱ,Ⅲ和Ⅳ产生相同的目标代码。

Page 41: 第 12 章  代码生成

这里涉及到过函子程序的入口地址问题。可有三种处理方法:一是把入口地址定为执行部分的头;一是把入口地址定为块的头,而其头目标代码为转向执行部分的转移代码;一是把入口地址定为块的头,但在每个子程序前面放一条跳过该子程序的跳跃代码。我们采用第三种处理方法。

Page 42: 第 12 章  代码生成

PROC 和 FUNC 四元式要完成的工作有三: 1. 结束基本块 2. 记入口地址 3. 生成目标代码

PROCEND 和 FUNCEND 四元式要完成的工作 有三: 1. 结束基本块 2. 生成目标代码 3. 回填跳跃目标代码的转移地址 

Page 43: 第 12 章  代码生成

12.10 过程、函数调用四元式的翻译

考虑的四元式有:

Ⅰ. (ACT, OPR1, β, OFF)

Ⅱ. (CALL, f, ——, T )

Page 44: 第 12 章  代码生成

当 CALL 为过程调用时无 T部分。其中OFF 是形参的区距, OPR1 是实参部分,当形参为赋值型时 β值为 1(否则为 0)。下面分几种情形讨论。

1. 形参为赋值型形参情形 2. 形参为引用型形参情形 3. 形参为过函标识符情形