若PL/0编译程序运行时的存储分配策略采用栈式动态分配,有如下源程序,试着给出当第二次执行到语句f:=h时栈式分配示意图,重点标明动态链(DL表示)和静态链(SL表示)的指向。 PROGRAM main; VAR a,b,c:real; PROCEDURE x; VAR d,e:real; PROCEDURE y; VAR f,g:real; BEGIN … f:=h; … END;{y} PROCEDURE z; VAR h,i,j:rea; BEGIN … y; … END;{z} BEGIN … y; … z; … END;{x} BEGIN … x; … END.{main}
时间: 2024-03-28 18:42:39 浏览: 8
根据题意,PL/0编译程序运行时的存储分配策略采用栈式动态分配,因此我们需要维护动态链(DL)和静态链(SL)的指向关系,同时还需要维护每个过程的基地址(BA)和每个变量的相对地址(RA)。
在第二次执行到语句f:=h时,栈式分配的示意图为:
```
| |
| j | <- SP
| i |
| h | <- DL
| g |
| f | <- SL
| e |
| d | <- BA
| c |
| b |
| a |
|_________|
```
其中,SP表示栈顶指针,DL表示动态链指针,SL表示静态链指针,BA表示基地址,RA表示相对地址。
在执行过程中,首先会执行z过程中的语句y,此时栈的状态为:
```
| |
| j | <- SP
| i |
| h | <- DL
| g |
| f | <- SL
| e |
| d | <- BA
| c |
| b |
| a |
|_________|
```
在y过程中,f的相对地址为-3,因此SL指向的地址为当前过程的基地址-3,即d的地址,DL指向的地址为上一层过程的DL,即z过程的h的地址。
执行完y过程后,栈的状态为:
```
| |
| j | <- SP
| i |
| h | <- DL
| g |
| f | <- SL
| e |
| d | <- BA
| c |
| b |
| a |
|_________|
```
然后继续执行z过程中的语句,此时栈的状态为:
```
| |
| j | <- SP
| i |
| h | <- DL
| g |
| f | <- SL
| e |
| d | <- BA
| c |
| b |
| a |
|_________|
```
在z过程中,执行完y过程后,栈的状态与上一次相同,然后执行z过程中的语句,此时栈的状态为:
```
| |
| j | <- SP
| i |
| h | <- DL
| g |
| f | <- SL
| e |
| d | <- BA
| c |
| b |
| a |
|_________|
```
最终执行完整个程序后,栈的状态为:
```
| |
| | <- SP
| |
| |
| |
| |
| |
| |
| |
| |
|_________|
```