编译原理-代码生成 课后习题+笔记

代码生成

来源:龙书(厚),南大课后作业

p333 8.2.2

假设 a 和b 是元素为 4 字节值的数组,为下面的三地址语句序列生成代码

  1. 四个语句的序列
    x = a[i]
    y = b[j]
    a[i] = y
    b[j] = x
  2. 三个语句的序列
    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续

  1. 为基本块
    a[i] = b
    b = c + a
    d = a[j]
    d = c + b
    构造 DAG 图
  2. 为基本块
    b=a[i]
    c=b+d
    a[j]=c
    构造DAG图
Answer
  1. 在这里插入图片描述
知识点

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

机器代码与寄存器和地址描述符 :
在这里插入图片描述

知识点
  • 代码生成算法
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值