if (m>=n) a=a+1; else
上述四元式代码序列G可翻译为 (1) MOV AX, B (2) ADD AX, C (3) MOV T1, AX (4) MOV AX, T1 (5) MUL AX, D (6) MOV T2, AX (7) MOV AX, T2 (8) ADD AX, E (9) MOV A, AX
从正确性来看,这种翻译不存在问题,但却存在冗余。 指令序列中的(4)和(7)两条指令是多余的;而T1、T2均是中间 代码生成时产生的临时变量,它们在出了基本块后将不再使 用,故(3)、(6)两条指令也可删去。因此,在考虑了效率和充 分使用寄存器之后,应生成如下代码:
如一C语言语句A=(B+C)*D+E,翻译为四元式G: T1=B+C T2=T1*D A=T2+E
如果不考虑代码的效率,可以简单地把每条中间代 码(四元式)映射成若干条目标指令,如将x=y+z映射为
MOV AX, y /*AX为寄存器*/ ADD AX, z MOV x, AX 其中,x、y、z均为数据区的内存变量。
① 如果AVALUE [Ri]中不包含M,则生成目标代码MOV M, Ri ;
② 当M不是A时,如果M是B或者M是C且同时B也在
RVALUE [Ri]中,则令AVALUE [M]={M,R},否则令AVALUE [M]={M};
③ 删除RVALUE [Ri]中的M。 (4) 给出R,返回。
例7.2 对例7.1,假设只有AX和BX是可用寄存器,用代码 生成算法生成目标代码及其相应的RVALUE和AVALUE。
(1) 首先将基本块中各变量的符号表的待用信息栏置为 “非待用”,对活跃信息栏则根据该变量在基本块出口之后是 否活跃而将该栏中的信息置为“活跃”或“非活跃”。