PL/0程序运行栈中的过程活动记录
PL/0程序运行时,每一次过程调用都将在运行栈增加一个过程活动记录。 其中,当前活动记录的起始单元由基址寄存器b指出,结束单元是栈顶寄存器t所指单元的前一个单元。
PL/0的过程活动记录中的头3个单元是固定的联系信息:
- 静态链SL:存放的是定义该过程所对应的上一层过程,最近一次运行时的活动记录的起始单元。
- 动态链DL:存放的是调用该过程前正在运行过程的活动记录的起始单元。过程返回时当前活动记录要被撤销,此时需要动态链信息来修改基址寄存器b的内容。
- 返回地址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
它的运行栈为:
这一章可能要考的内容
- 运行栈的填写(静态链、动态链)
- display表(本质上是记录各个层定义的最新活动记录)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持以下吧
请登录后发表评论
注册