- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
小结 machunyan 西北工业大学软件与微电子学院 * 什么是活动记录?请给出C语言活动记录的内容。 设有c语言程序: main() { printf(“%d\n”,f(3)); } f(int x) { if(x==1) return 1; else return x*f(x-1); } 试给出运行该程序在返回主函数之前运行栈的活动 记录示意图。 machunyan 西北工业大学软件与微电子学院 * m:2 返回地址 控制链 y:1 fp mOffset yOffset mOffset=+8 yOffset=-4 高端地址 低端地址 对名字的访问:(续) machunyan 西北工业大学软件与微电子学院 * 例:考虑下面的C过程 Viod f(int x,char c) {int a[10]; double y; …… } c x 返回地址 控制链 a[9] … a[1] a[0] y fp cOffset aOffset xOffset yOffset xOffset=+8 cOffset=+12 aOffset=-40 yOffset=-48 现在对a[i]访问,要求计算地址: (-40+4*i)(fp) 对名字的访问:(续) 对f调用的活动记录为: machunyan 西北工业大学软件与微电子学院 * 目标代码的生成必须 支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 局部临时变量 嵌套声明 如何处理可变长度的问题 7.3 基于栈的运行时环境(续) machunyan 西北工业大学软件与微电子学院 * 局部临时变量: 考虑C表达式:x[i]=(i+j)*(i/k+f(j)),在这个表达式从左到右的求值计算中,在对f的调用过程中需要保存中间结果: x[i]的地址、i+j的和、i/k的商。 这些中间值可计算到寄存器中,根据寄存器进行保存和恢复;或者可将它们作为临时变量存储在对f调用之前的运行时栈中。如下所示: machunyan 西北工业大学软件与微电子学院 * … 返回地址 控制链 … x[i]的地址 i+j的结果 i/j的结果 fp (栈的其余部分) sp 临时栈 调用f(将要创建的)时的 新活动记录 包含表达式过程的活动记录 自由空间 局部临时变量:(续) machunyan 西北工业大学软件与微电子学院 * 目标代码的生成必须 支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 局部临时变量 嵌套声明 如何处理可变长度的问题 7.3 基于栈的运行时环境(续) machunyan 西北工业大学软件与微电子学院 * 嵌套声明也出现了与局部临时变量同样的问题。考虑以下的C代码: Void p(int x,double y) { char a; int i; … A:{ double x; int j; … } … B:{ char *a; int k; … } … } 嵌套声明: machunyan 西北工业大学软件与微电子学院 * x: y: 返回地址 控制链 a: i: x: j: fp (栈的其余部分) sp 块A的分配区 调用p时的活动记录 自由空间 嵌套声明:(续) 一个简单的处理办法是按照与临时表达式相类似的办法在嵌套的块中处理声明,并在进入块时在栈中分配它们。当进入块A后,运行时栈如下所示: machunyan 西北工业大学软件与微电子学院 * x: y: 返回地址 控制链 a: i: a: k: fp (栈的其余部分) sp 块B的分配区 调用p时的活动记录 自由空间 当进入块B后,运行时栈如下所示: 嵌套声明:(续) machunyan 西北工业大学软件与微电子学院 * 目标代码的生成必须 支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 局部临时变量 嵌套声明 如何处理可变长度的问题 7.3 基于栈的运行时环境(续) machunyan 西北工业大学软件与微电子学院 * 处理可变长度的数据 有时编译程序必须处理数据变化的可能性,表现在数据对象的数量和每个对象的大小上。发生在支持基于栈的环境的语言中的一种情况如下: ① 调用中的自变量的数量可根据调用的不同而不同。 printf(“%d%s, n, prompt); printf(“%d %d %d ”,3,4,50); 通常,C编译程序一般通过把调用的自变量按相反顺序(in reverse order)压入到运行时栈来处理这一点。 machunyan 西北工
文档评论(0)