{
backpatch(S1.nextlist, nextquad) p:=nextquad+2;
emit(‘j?,’ F.place‘,’ F.final ’,’ p );
S.nextlist := merge(F.nextlist, makelist(nextquad)); emit(‘j,-,-,-’);
?emit(‘succ,’ F.place ’, -,’ F.place); emit(‘j,-,-,’ F.quad); ?}
第九章
P270–9
(1) 传名
即当过程调用时,其作用相当于把被调用段的过程体抄到调用出现处,但必须将其中出现的任一形式参数都代之以相应的实在参数。 A:=2; B:=3; A:=A+1; A:=A+(A+B); print A; ∴A=9 (2) 传地址
即当程序控制转入被调用段后,被调用段首先把实在参数抄进相应的形式参数的
形式单元中,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。当被调用段工作完毕返回时,形式单元(都是指示器)所指的实参单元就持有所希望的值。
①A:=2;B:=3;T:=A+B
②把T,A,A的地址抄进已知单元J1,J2,J3
③x:=J1;y:=J2;z:=J3 //把实参地址抄进形式单元,且J2=J3 ④Y↑:=y↑+1
Z↑:=z↑+x↑ // Y↑:对y的间接访问 Z↑:对z的间接访问 ⑤print A A=8 (3) 得结果
每个形参均对应两个单元,第一个存放实参地址,第二个存放实参值,在过程体中对形参的任何引用或赋值都看成是对它的第二个单元的直接访问,但在过程工作完毕返回前必须把第二个单元的内容放到第一个单元所指的那个实参单元中 ①A:=2;B:=3;T:=A+B
②把T,A,A的地址抄进已知单元J1,J2,J3 ③x1:=J1;x2:=T; y1:=J2;y2:=A;
z1:=J3;z2:=A; //将实参的地址和值分别放进两个形式单元中 ④y2:=y2+1; z2:=z2+x2; //对形参第二个单元的直接访问
⑤x1↑:=x2; y1↑:=y2; z1↑:=z2 //返回前把第二个单元的内容存放到第一
个单元所指的实参地址中
⑥print A A=7 (4) 传值
即被调用段开始工作时,首先把实参的值写进相应的形参单元中,然后就好像使用局部变量一样使用这些形式单元A:=2; B:=3; x:=A+B y:=A z:=A y:=y+1 z:=z+x print A A=2
过程调用不改变A的值
P306-1 P306-2
read A,B F:=1
C:=A*A B1第十章B
D:=B*B
if C B--------------------------- E:=A*A F:=F+1 E:=E+F B2 write E halt --------------------------- L1: E:=B*B F:=F+2 E:=E+F B3 write E if E>100 goto L2 --------------------------- halt B4 --------------------------- L2: F:=F-1 goto L1 B5 --------------------------- 基本块为B1、B2、B3、B4、B5 P307-4 BBBI:=1 A:=K*I B:=J*I L: C:=A*B write C A:=A+K halt B2有回路,所以{B2}是循环,B2既是入口节点,又是出口节点 (1) 代码外提:不存在不变运算,故无代码外提 (2) 强度削弱:A:=K*I B:=J*I *→+ (3) 删除基本归纳变量:I<100 可以用A<100*K或B<100*J代替 P307-5 A:=0 I:=1 {B2,B3}是循环,B2是入口节点,也是出口节点 (1) 代码外提:B:=J+1 B:=J+1 (2) 删除归纳变量 C:=B+I L1’: A:=C+A C:=C+1