首页 理论教育 栈式存储分配-编译原理与实践

栈式存储分配-编译原理与实践

时间:2023-11-17 理论教育 版权反馈
【摘要】:图7-15给出了一个C语言的程序结构。在这种情况下,关于局部名称的存储分配,可以直接采用栈式分配策略。图7-15一个C语言程序使用栈式存储分配意味着把存储组成一个栈。因此,当程序运行时,首先在存储器中分配全局数据区,然后分配main的活动记录,在调用r时将把r的活动记录压入栈,在r调用s时将把s的活动记录也压入栈。

栈式存储分配-编译原理与实践

这种方式适用于没有分程序结构,过程定义不嵌套,但允许过程递归调用的语言,如C语言。图7-15给出了一个C语言的程序结构。在这种情况下,关于局部名称的存储分配,可以直接采用栈式分配策略。

图7-15 一个C语言程序

使用栈式存储分配意味着把存储组成一个栈。运行时,每当进入一个过程,就要将其活动记录压入栈中,从而形成过程工作时的数据区;当该过程退出时,再把它的活动记录弹出栈。显然,过程活动记录的大小在编译时是可静态确定的。在图7-15中,主程序main调用了过程r,r又调用了过程s。因此,当程序运行时,首先在存储器中分配全局数据区,然后分配main的活动记录,在调用r时将把r的活动记录压入栈,在r调用s时将把s的活动记录也压入栈。于是,程序运行时的数据空间可表示为如图7-16所示的结构。

在图7-16中,用SP指向当前过程活动记录的起点,而用TOP指向栈顶单元。需要说明的是,图中的低地址部分(栈底)的全局数据区是可静态确定的,可采用静态存储分配策略,即在编译时就能确定每个全局名字的地址。于是,当某过程体引用全局名字时可直接使用该地址。然而,对于过程里所定义的局部名字,其存储空间则在该过程相应的活动记录里。由于程序运行时每个过程可以有若干个不同的活动记录,每个活动记录都代表了一个不同的过程调用,因此,这种环境所要求的记录与变量访问技术要比静态环境复杂得多。

图7-16 C语言程序的存储分配

如图7-17所示,通常,C语言过程的活动记录包含以下4项内容:

(www.xing528.com)

图7-17 C过程的活动记录

(1)连接数据,主要有两个:一个是旧SP值,即前一活动记录的起始地址;另一个是返问地址。

(2)参数个数。

(3)形式单元。

(4)过程的局部变量数组内情向量以及临时工作单元。

过程的所有局部变量和形参在活动记录中的位置是确定的,其地址是相对于活动记录的基地址SP的。因此,程序运行时可按如下方法确定局部变量和形参在栈中的绝对地址:

绝对地址=SP+相对地址

于是,可以用变址访问方式X[SP]来引用当前活动过程中的任何局部变量或形参X,此处X代表相对数,也就是相对于活动记录起点的地址。很明显,相对数X在编译时可完全确定下来。同样,数组内情向量的相对地址在编译时也可确定下来,一旦数据空间在过程里获得分配后,对数组元素的引用也就很容易用变址访问的方式来实现。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈