- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章 运行时存储空间的组织和管理 一、数据的存储单元 编译程序必须为目标程序的运行分配数据的 存储单元。 如:变量、常量单元,临时工作单元,返回地址 若无存放数据信息的单元,则目标程序将无法运行。 二、存储单元分配策略 1、静态存储分配 在编译时就可以完全为数据项目分配存储单元,称为静态存储分配。 注:若一个程序设计语言不允许递归调用,而且不含有可变数组,则可使用静态存储分配策略。 2、动态存储分配 在运行时才能进行数据存储单元分配,称为动态存储分配。 注:1)若某程序设计语言允许过程递归调用,而且允许使用可变数组,那么在编译时就不可能完全为其数据项目分配存储单元,必须采取动态存储分配策略。 2)动态分配数据单元时一般使用: 栈式存储分配 堆式存储分配 2、动态存储分配 (1)栈式存储分配 运行时,每进入一个过程,就在栈顶为该过程分配一块数据区,一旦退出该过程,它所占的空间也退还给系统。 (2)堆式存储分配 有些语言允许用户随时动态地申请和释放存储空间,但申请和释放之间不遵守先申请后释放或后申请先释放原则,故不能使用栈式存储分配,而是更复杂的动态分配策略。 这种策略是:让运行程序持有一个大的存区(堆),在申请时从堆中取一块,释放时将一块存储区退还给堆。 栈式存储管理 一、允许过程(函数)递归调用的数据存储管理 1、语言特点 允许过程(函数)的递归调用,但不允许定义嵌套的过程(函数),也不许使用可变数组。如C语言。 2、栈式存储分配: 每进入一个过程,就有相应的数据区建立在栈顶。当程序开始运行前,用于建造数据区的栈是空栈。当开始进入主程序执行语句前,便在栈中建立全局变量和主程序数据区。在主程序中若有调用过程的语句时,便在栈顶累筑该过程的活动记录。在进入过程后执行过程的可执行语句前再把局部数组累筑于栈顶,若还有调用过程的语句就重复上述过程。 例如有如下程序: MAIN () {…… Q( ); } P( ) {……} Q( ) {…… P( ); } 当P过程进入运行后,栈顶数据区有两个指针: SP指向现行过程数据区起点; TOP指向顶点 注:从数据区中引出指向主程序数据区的箭头表示外部变量引用关系。 3、活动记录: 包含连接数据、形式单元、局部变量、内情向量和临时工作单元等。 注:1)活动记录的建立是按照调用次序而累筑,而非排列次序; 2)栈顶活动记录数据区有两个指针SP和TOP,SP指向现行数据区起点,TOP指向顶点; 3)从数据区中引出指向主程序数据区的箭头表示外部变量引用关系; 4)C语言的活动记录所含区段是:连接数据(包含老SP值(即前一活动记录的首地址;或称施调过程的数据区首地址)和返回地址(即调用语句的下一条指令的地址))、参数(形参)个数、形式单元(存放实参值或地址)、过程的局部变量(简单变量)、数组内情变量和临时工作单元。 5)过程中的局部变量(简单变量)在内存地址可表示为变址形式x[SP],其中SP为当前数据区首地址,用作变址值,x称为相对位移量。连接数据: 老SP值:前一活动记录的首地址(施调过程的数据区首址); 返回地址; 简单变量X在数据区内相对地址设为x,则,x的内存地址表示为变址形式x[SP],SP为当前数据区首址,x为相对位移量。 4、C语言的数据区建立与撤销 1)过程调用段: Call语句翻译成中间代码后所作操作有两个:将参数传递到过程或函数的数据区的形参单元中;跳转到过程或函数。 例如:call Q(T1,T2,…,Tn)语句的中间代码为: Par T1 … Par Tn Jsr n,Q 注:C语言的数据区 是由过程调用引起 2)过程进入段工作: 定义新活动记录的SP,保护返回地址和定义这个活动记录的TOP,即: SP:=TOP+1 1[SP]:=返回地址 TOP:=TOP+L /*L是过程Q的活动记录所需单元数*/ 3)过程返回段 (1)假定此时E的值已经计算出来并已放在某临时单元T中,那么就将T值传送到某个特定的寄存器中,以备调用段获取(调用段将从此寄存器获得被调用过程的结果值); (2)恢复SP和TOP,以便回到调用段的数据区。 TOP:=SP-1;
文档评论(0)