代码生成
来源:龙书(厚),南大课后作业
p333 8.2.2
假设 a 和b 是元素为 4 字节值的数组,为下面的三地址语句序列生成代码
- 四个语句的序列
x = a[i]
y = b[j]
a[i] = y
b[j] = x - 三个语句的序列
x = a[i]
y = b[i]
z = x*y
Answer
(1)
x = a[i]
y = b[j]
a[i] = y
b[j] = x
生成代码:
LD R1, i
MUL R1, R1, 4
LD R2, a(R1)
ST x, R2
LD R3, j
MUL R3, R3, 4
LD R4, b(R3)
ST y, R4
ST a(R1), R4
ST b(R3), R2
(2)
x = a[i]
y = b[i]
z = x*y
生成代码:
LD R1, i
MUL R1, R1, 4
LD R2, a(R1)
ST x, R2
LD R1, b(R1)
ST y, R1
MUL R1, R2, R1
ST z, R1
知识点
- 代码生成器
- 龙书P330
- 龙书P331
p333 8.2.4
假设 x、y 和 z 存放在内存位置中,为下面的三地址语句序列生成代码
if x < y goto L1
z = 0;
goto L2
L1: z = 1
Answer
100 LD R1, x
101 LD R2, y
102 SUB R1, R1, R2
103 BLTZ R1, 106
104 ST z, #0
105 BR L2
106 ST z, #1
知识点
- BLTZ中LTZ表示 lower than zero
p348 8.5.1
为下面的基本块构造 DAG
d = b * c
e = a + b
b = b * c
a = e – d
Answer
知识点
- DAG(有向无环图)构造
p348 8.5.1续
- 为基本块
a[i] = b
b = c + a
d = a[j]
d = c + b
构造 DAG 图 - 为基本块
b=a[i]
c=b+d
a[j]=c
构造DAG图
Answer
知识点
p352 8.6.1
为下面的每个 C 语言赋值语句生成三地址代码
(1) x = a + b*c;
Answer
t = b * c
u = a + t
x =u
知识点
p353 8.6.4
假设有三个可用的寄存器,适用本节中的简单代码生成算法,把在练习 8.6.1 中的带的三地址代码转换为机器代码。请给出每一个步骤之后的寄存器和地址描述符
(1) x = a + b*c;
Answer
三地址代码:
t = b * c
u = a + t
x =u
机器代码与寄存器和地址描述符 :
知识点
- 代码生成算法