四元式的翻译以及寄存器分配
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优化后语法
- T1=A/B;
- T2=6;
- T3=3+T1;
- M=T3;
- T4=T1;
- C=3;
- T5=9;
- T6=T1+9;
- N=T6;
其实,优化后只是删除了C=4这一个句子。显然优化是需要删除的,根本没有看出需要什么DAG图。
2.2.3继续优化
如果题目有有说基本块之外临时变量不再使用,则可以删除所有不参加计算的临时变量,只保留和非临时变量有关的指令。
- T1=A/B;
- M=6+T1;
- C=3;
- N=T1+9;
2.3寄存器分配
一般在四元式代码中,通常把左操作数放入寄存器R中,再和C进行操作,R中保存结果。
老师所给示例如下: