《编译原理-龙书》练习第8章

代码生成:

中间表示形式+符号表 -> 指令选择,寄存器分配和指派,指令排序


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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值