代码生成:
中间表示形式+符号表 -> 指令选择,寄存器分配和指派,指令排序
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
3)循环有3个:B4自身,B3B4B5,B2B3B4B5B6
8.4.2 类似,略
8.5 基本块的优化
8.5.1
a1
+(e) *(d,b)
a0 b0 c0
8.5.2
1)只有a活跃,则第一行可以优化掉
2)abc活跃,则同样第一行d=b*c可以优化掉
8.5.3 B6 原理类似8.5.1,略
8.5.4 B3 原理类似8.5.1,略
8.5.5
1) a[i]=b a设置为不活跃,b设置为活跃,影响所有对数组a的引用
2) a=b[i] a设置为不活跃,b设置为活跃,影响所有对数组b的引用
3) a=*b a设置为不活跃,b设置为活跃,从后往前扫描过程中,所有对b的引用都是活跃的
4) *a=b a设置为不活跃,b设置为活跃,从后往前扫描过程中,所有对a的引用都是不活跃的
8.5.6 在

本文详细探讨了编译原理中的目标代码生成,包括基本块、流图、指令选择和寄存器分配。通过实例解析了如何将中间表示形式转换为目标代码,并讨论了基本块的优化、窥孔优化和寄存器分配等关键步骤。此外,还涉及表达式优化代码生成的策略和动态规划在代码生成中的应用。
最低0.47元/天 解锁文章
4822

被折叠的 条评论
为什么被折叠?



