- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理chapter6,编译原理,编译原理pdf,编译原理词法分析程序,编译原理视频教程,编译原理课后习题答案,编译原理第三版,编译原理第三版pdf,编译原理及实践,编译原理龙书
第六章 活动记录Activation Records 计算机科学与技术学院 刘 慧 Stack:一个有序的积累或堆积。 几乎所有的现代程序设计语言中,函数都可以有局部变量(local variables),这些局部变量是在函数的入口创建的。 在同一时刻可能存在对函数的多个调用(invocations),每个调用都有它自己的局部变量实例(instantiations)。 f 的每次调用都会创建 x 的一个新实例,因为存在递归调用,因此可以同时存在 x 的很多个实例。 类似地,每当进入f 的函数体时,都将创建一个y的新实例。 在很多语言中(例如C、Pascal和Tiger),当函数返回时,局部于该函数的变量便都会消失,因为一个函数只有在它调用的所有函数都返回以后,它才能返回。 函数调用是按后进先出(LIFO)方式进行的,如果在函数的入口创建局部变量,在函数的出口删除它们,则可使用“栈”来存放它们。 6.1 Stack Frames 通常意义上的“栈”:支持压入(push)和弹出(pop)操作的数据结构。 但是,局部变量会成批压入和弹出栈,而且,当局部变量在栈中被创建时,它们一般不会被立刻初始化。最后,当向栈中压入很多变量之后,还会需要访问压在栈顶之下较深的变量。 因此,抽象的压入和弹出模式并不适合。 6.1 Stack Frames 可以将栈看成是一个大型数组,并带有一个特殊寄存器,即栈指针(stack pointer)。 栈中空间的划分: 超出栈指针的所有位置为自由存储空间(garbage); 位于栈指针之前的位置为已分配存储空间(allocated)。 栈通常只在函数的入口处增长,它通过增加足以容纳该函数的所有局部变量的一片存储空间来扩大栈。栈在函数的出口处收缩,收缩的空间就是入口时扩大的空间。 6.1 Stack Frames 栈中用来存放一个函数的局部变量、参数、返回地址和其他临时变量的这片区域称为该函数的活动记录(activation record)或栈帧(stack frame)。 栈帧布局的设计要考虑到指令集的体系结构特征和被编译的程序设计语言的特征。“标准”栈帧布局便于被所有的程序设计语言编译器采纳,使得用不同程序设计语言编写的函数可以相互调用。 6.1.1 The Frame Pointer 设函数g(…)调用函数f(a1,a2, …an): g是调用者(caller); f是被调用者(callee)。 在进入函数f时,栈指针(Stack Pointer)指向g传递给f的第一个参数。在f的入口,f简单地使SP减去帧的长度而分配一个新栈帧。 6.1.1 The Frame Pointer 原来的SP则变成了当前的帧指针(Frame Pointer)。 某些栈帧布局中: FP是一个单独的寄存器; 原来的FP保存在存储器中(栈帧内)。 当函数f退出时,需要复制FP到SP,并取回保存在存储器中的FP。 适合于栈帧大小可变或不连续的情况。 6.1.1 The Frame Pointer 如果栈帧的大小是固定不变的,则对于每一个函数f,FP与SP所指的位置总是相差一个已知的常数:“虚”寄存器FP=SP+栈帧大小。 问题:当栈帧大小是常数时,为何还讨论帧指针 栈帧的大小要到编译处理相当晚的时候才能知道,即要到给临时变量分配的空间大小和用于保护寄存器的空间大小都已确定时。但是,尽早知道形参与局部变量的位移量是有好处的。 6.1.2 Register 将局部变量、表达式的中间结果和其他值保存在寄存器中,而不是放在栈帧中,将有助于编译生成的程序快速地运行。 算术指令可以直接访问寄存器。 在大多数计算机中,存储器的访问需要使用独立的存取指令(load and store instructions)。即使在那种算术指令可以访问存储器的计算机中,访问寄存器的速度也比访问存储器快。 6.1.2 Register 假设函数f在用寄存器r保存了它的一个局部变量的同时调用过程g,而过程g也需用r完成自己的计算: 在g使用r之前先将r保护起来(将它保存在栈帧内); 完成计算而不再需要时将r恢复(从帧栈中取回被保存的内容)。 保护和恢复该寄存器的责任: 如果由调用者f来保护和恢复,则称r为调用者保护的(caller-save)寄存器; 如果由被调用者g来保护和恢复,则称r为被调用者保护的(callee-save)寄存器; 6.1.2 Register 在多数计算机体系结构中,调用者保护的寄存器和被调用者保护的寄存器的概念并不是由硬件来实现的,而是在机器参考手册(machine’s reference manual)中规定的。 例如MIPS计算机: 保留寄存器r16-r23用于跨过程调用(属于被调用者保护的寄存器); 其他所有寄存器则不保
您可能关注的文档
最近下载
- 2025秋国开《形势与政策》形考大作业答案:如何理解“作风建设永远在路上,永远没有休止符”?我们应如何加强作风建设?.doc VIP
- 机电工程备品备件方案(3篇).docx VIP
- 集装箱多式联运复习试题含答案.doc
- 3.5.2医院感染相关监测(达C档).doc VIP
- 初中英语2024届中考词法复习名词专项练习(真题版)(附参考答案) .pdf VIP
- 大作业:如何理解“作风建设永远在路上,永远没有休止符”?我们应如何加强作风建设?.docx VIP
- 【7A版】超能分期“商户贷”操作指引.docx VIP
- 数智时代国际中文教育学科的内核与边界.docx VIP
- 2025年北京市西城区高三一模政治试卷及答案.pdf
- 理解性默写 统编版高中语文选择性必修下册.docx VIP
文档评论(0)