四元式的翻译以及寄存器分配

四元式的翻译以及寄存器分配

1.四元式的翻译

1. (Program,Pro_id,,)
MAIN SEGMENT:
ASSUME CS:MAIN,DS:MAIN,ES:MAIN
2. (sys,_,_,_)
终止程序的运行返回OS
3. (+,A,B,T)
MOV AX,A;
ADD AX,B;
MOV T,AX;
4. (=,B,_,A)
MOV AX,B;
MOV A,AX;
5. (jnz,A,_,P)
MOV AX,A;
CMP AX,0;
JNZ P;
6. (j,_,_,P)
JMP P;
7. (jrop,A,B,P)
MOV AX,A;
CMP AX,B:
JROP P;

2.寄存器分配

2.1活跃变量和引用信息

eg:
(p) A=B+C; A在p点是活跃的
(r) E=A+F; r是变量A的引用信息
(q) D=A+V;

所有的非临时变量都看作是出基本块后的活跃变量
所有的临时变量均看作是出基本块后的非活跃变量

2.1.1基本块内的引用信息链和活跃信息链

序号四元式结果左变量右变量
1(-,A,B,T)(5,y)(2,y)(2,y)
2(+,A,B,A)(3,y)(n,n)(5,y)
3(-,A,C,U)(n,y)(n,y)(4,y)
4(+,C,D,V)(n,n)(n,y)(n,y)
5(+,T,B,V)(n,y)(n,y)(n,y)

对该表的解释以及解题技巧:
- 表中(a,b)二元组,a表示是否引用,若引用,则标示位置;b表示是否活跃;
- 如果有引用信息的话,一定是活跃的;
- 如果某一变量数值被覆盖的话,是没有引用和活跃的(如:2中的A,以及4,5中的V)

2.2DAG对基本块进行优化

题目如下:
1. T1=A/B;
2. T2=3*2;
3. T3=T2+T1;
4. M=T3;
5. C=4;
6. T4=A/b;
7. C=3;
8. T5=12-C;
9. T6=T4+T5;
10. N=T6;

2.2.1做出DAG图

这里写图片描述
对比之前的各个表达式很容易得到这个图。具体的过程就是左子树节点是表达式左变量、右子树节点是表达式右变量。
其实DAG具体作用感觉是更容易理解化简过程,而不是真正的使用,考试起来似乎是不太需要做出DAG图的,利用其思想可能会更好更快

2.2.2优化后语法

  1. T1=A/B;
  2. T2=6;
  3. T3=3+T1;
  4. M=T3;
  5. T4=T1;
  6. C=3;
  7. T5=9;
  8. T6=T1+9;
  9. N=T6;

其实,优化后只是删除了C=4这一个句子。显然优化是需要删除的,根本没有看出需要什么DAG图。

2.2.3继续优化

如果题目有有说基本块之外临时变量不再使用,则可以删除所有不参加计算的临时变量,只保留和非临时变量有关的指令。

  1. T1=A/B;
  2. M=6+T1;
  3. C=3;
  4. N=T1+9;

2.3寄存器分配

一般在四元式代码中,通常把左操作数放入寄存器R中,再和C进行操作,R中保存结果。

老师所给示例如下:
这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值