首先,我们需要确定每个变量和过程在栈中的位置,以及静态链和动态链的指向。假设在程序开始运行时,栈顶指针SP指向栈底,静态链SL和动态链DL都指向0号活动记录。

在开始执行主程序main时,栈中的情况如下:

|    ...    |
|-----------|
|   SL=0    |
|   DL=0    |
|-----------|
|    a      |
|-----------|
|    b      |
|-----------|
|    c      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=0    |
|   DL=0    |
|-----------|

其中,返回地址和旧的BP是由于调用main时需要保存的信息。

当执行到x过程时,会在栈顶压入新的活动记录,x的静态链指向0号活动记录,动态链指向上一个活动记录(即main的活动记录),BP指向新的活动记录的起始位置,栈中的情况如下:

|    ...    |
|-----------|
|   SL=0    |
|   DL=1    |
|-----------|
|    a      |
|-----------|
|    b      |
|-----------|
|    c      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=0    |
|   DL=0    |
|-----------|
|    d      |
|-----------|
|    e      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=1    |
|   DL=0    |
|-----------|

注意到y过程的静态链指向x的活动记录,动态链指向上一个活动记录(即x的活动记录),BP指向新的活动记录的起始位置。

当执行到z过程时,会在栈顶再次压入新的活动记录,z的静态链指向0号活动记录,动态链指向上一个活动记录(即x的活动记录),BP指向新的活动记录的起始位置,栈中的情况如下:

|    ...    |
|-----------|
|   SL=0    |
|   DL=2    |
|-----------|
|    a      |
|-----------|
|    b      |
|-----------|
|    c      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=0    |
|   DL=1    |
|-----------|
|    d      |
|-----------|
|    e      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=1    |
|   DL=0    |
|-----------|
|    h      |
|-----------|
|    i      |
|-----------|
|    j      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=2    |
|   DL=1    |
|-----------|

注意到y过程的静态链指向x的活动记录,动态链指向上一个活动记录(即x的活动记录),BP指向新的活动记录的起始位置。

当执行到f:=h时,栈中的情况如下:

|    ...    |
|-----------|
|   SL=0    |
|   DL=2    |
|-----------|
|    a      |
|-----------|
|    b      |
|-----------|
|    c      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=0    |
|   DL=1    |
|-----------|
|    d      |
|-----------|
|    e      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=1    |
|   DL=0    |
|-----------|
|    h      |
|-----------|
|    i      |
|-----------|
|    j      |
|-----------|
|  返回地址  |
|-----------|
|  旧的BP   |
|-----------|
|   SL=2    |
|   DL=1    |
|-----------|
|    f      |
|-----------|

注意到f和h都在z过程的活动记录中定义,因此它们的静态链和动态链都指向z的活动记录

若PL0编译程序运行时的存储分配策略采用栈式动态分配有如下源程序试着给出当第二次执行到语句f=h时栈式分配示意图重点标明动态链DL表示和静态链SL表示的指向。PROGRAM main;	VAR abcreal;	PROCEDURE x;		VAR dereal;		PROCEDURE y;			VAR fgreal;			BEGIN				…				f=h;				…			END;y		PROCE

原文地址: http://www.cveoy.top/t/topic/g2LF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录