例题 11.1 假设可用的寄存器为 R0 和 R1,且所有临时单元都有是非活跃的,试对以下四元
式基本块:
T1:=B-C
T2:=A*T1
T3:=D+1
T4:=E-F
T5:=T3*T4
W=T2/T5
用简单代码生成算法生成其目标代码。
解题思路:
简单代码生成算法是依次对四元式进行翻译。不妨先考虑下面单一的四元式的翻译过程:
T:=a+b
由于汇编语言的加法指令代码形式为:
ADD R, X
其中 ADD 表示为加法指令,R 为第一个操作数,且第一个操作数必须为寄存器类型,
X 为第二个操作数,它可以是寄存器类型,也可以是内存型的变量类型。该指令的意义为,
将第一个操作数 R 与第二个操作数 X 进行相加,再将累加结果存回到第一个操作数的寄存
器 R 中。所以,要完整地翻译出四元式 T:=a+b,则可能要如下的三条汇编指令:
LD R, a
ADD R, b
ST R, T
上面三条指令的含义是:第一条指令是第一个操作数 b 从内存装入一个寄存器 R 中,
第二条指令进行加法运算;第三条指令再将第二条指令的累加结果写回到内存中的变量 T
中。
那么,是不是一个四元翻译成目标代码时都有要生成三条汇指令呢?如果考虑到目标
代码生成过程中的两优化问题,则答案是否定的。即,为了使生成的目标代码更短和充分利
用计算机的寄存器,上面的三条指令中,第一条指令和第三条指令在某些情形下可能不是
必需的。这是因为,如果在翻译此四元式之前,已经有指令将操作数 a 放在某个寄存器中,
则第一条指令可以省略;同样,如果下一个四元式紧接着要引用操作数 T,则第三指令不
必急于执行,可延迟到以后适当的时机再执行。
评论0