代码生成:
中间表示形式+符号表 -> 指令选择,寄存器分配和指派,指令排序
8.2 目标语言
8.2.1 1) x = 1
LD r, #1
ST x, r
3)x = a+1
LD r, a
ADD r, #1
ST a, r
5)x = b*c
LD R1, b
MUL R1, c
ST x, R1
8.2.2 1)x=a[i] y=b[j] a[i]=y b[j]=x
LD R0 i
MUL R0, 4
LD R1 a(R0)
LD R0 j
MUL R0, 4
LD R2 b(R0)
ST a[i] R2
ST b[j] R1
2) x=a[i] y=b[i] z=x*y
LD R0 i
MUL R0, 4
LD R1 a(R0)
MUL R1 b(R0)
ST z R1
8.2.3 y=*q q=q+4 *p=y p=p+4
LD R1 q
LD R2 0(R1)
ADD R1 #4
ST q R1
LD R1 p
ST 0(R1) R2
ADD R1 #4
ST p R1
8.2.4
LD R1, x
LD R2, y
SUB R1-R2
BLTZ R1, M // M为L1生成第一条指令位置
8.2.5
LD R1, s
ST R1, 0
LD R2, i
ST R1, 0
LD R3, n
L1: CMP R2, R3
JG L2
ADD R1, R2
ADD R2, #1
GOTO L1
L2:
8.2.6 1) 2+2+1+2
8.3 目标代码中的地址
8.3.1 没有理解题中return什么意思,下面没有考虑return。假设这是main中一段代码
100: LD SP, #600
108: ACTION1
128: ADD SP, SP, #msize
136: ST 0(SP), #152
144: BR 300
152: SUB SP, SP #msize
160: ADD SP, SP #msize
168: ST 0(SP), #184
176: BR 400
184: SUB SP, SP #msize
192: ADD SP, SP #msize
200: ST 0(SP), #216
208: BR 500
216: SUB SP, SP #msize
300: ACTION
320: BR *0(SP)
400: ACTION
420: BR *0(SP)
500: ACTION
520: BR *0(SP)
8.3.2与8.3.3 8.3中没有类似这样的例子,栈式分配的话重要的是地址的确定,可以将这些语句当作函数中第一条语句生成代码
8.4 基本块和流图
8.4.1 一个二重循环一个三重循环,二重循环三地址语句类似于图8-7上半部分,流图类似于图8-9B1-B4,循环包括例8.9中1和3,下面练习一下三重循环
1)
1 i = 0
2 j = 0
3 k = 0
4 t1 = n*i
5 t2 = t1 + j
6 t3 = t1 + k
7 t4 = n*k
8 t5 = t4 + j
9 t6 = a[t3] * b[t5]
10 c[t2] = c[t2] + t6
11 k = k + 1
12 if(k<n) goto 4
13 j = j + 1
14 if(j<n) goto 3
15 i = i + 1
16 if(i<n) goto 2
2)三重循环流图:
B1 1
B2 2
B3 3
B4 4-12
B5 13-14
B6 15-16