第九章 运行时存储组织

PL/0程序运行栈中的过程活动记录

PL/0程序运行时,每一次过程调用都将在运行栈增加一个过程活动记录。 其中,当前活动记录的起始单元由基址寄存器b指出,结束单元是栈顶寄存器t所指单元的前一个单元。

PL/0的过程活动记录中的头3个单元是固定的联系信息:

  1. 静态链SL:存放的是定义该过程所对应的上一层过程,最近一次运行时的活动记录的起始单元。
  2. 动态链DL:存放的是调用该过程前正在运行过程的活动记录的起始单元。过程返回时当前活动记录要被撤销,此时需要动态链信息来修改基址寄存器b的内容。
  3. 返回地址RA:记录该过程返回后应该执行的下一条指令地址,即调用该过程的指令执行时指令地址寄存器p的内容加1

这样,每当一个过程被调用,就需要在栈上先分配3个空间用来存储上述信息,然后才是分配空间存储过程的局部变量。对于主过程,SL=DL=RA=0。

这里给出一道例题。对于下列程序:

var m, n, g:integer;function gcd(m,n:integer):integer;	begin		if n = 0 then			g := m		else			g := gcd(n, m mod n)	end;
begin	m := 24;	n := 16;	g := gcd(m, n)end.

123456789101112131415C

它的运行栈为:

这一章可能要考的内容

  1. 运行栈的填写(静态链、动态链)
  2. display表(本质上是记录各个层定义的最新活动记录)
© 版权声明
THE END
喜欢就支持以下吧
点赞0赞赏
分享
评论 抢沙发

请登录后发表评论