返回介绍

3.1 存储组织

发布于 2025-03-09 23:09:32 字数 3569 浏览 0 评论 0 收藏 0

一个高级语言程序由一或多个子程序组成,这些都是用户子程序。对应的二进制程序由用户子程序、被用户程序调用的库例程、和被链接器链接的其他子程序 (给编译器提供运行时支持) 组成。一个程序的二进制代码一般格式见图 3-1 所示。该程序的启动是通过调用编译器启动子程序建立它的运行环境;随后是用户主程序,它调用被链接器链接的库例程;并且在程序终止之前是由一系列编译器子程序恢复机器状态而完成。

启动代码

用户程序

(包括库子程序)

出口代码

图 3-1: 二进制程序的一般格式

例如,一个“hello world”C 程序,用 Borland Turbo C v2.01 编译以后,有超过 25 个不同的子程序。启动代码调用多达 16 个不同的子程序来建立编译器的环境。用户的主程序是由一个子过程组成。这个子过程调用 printf() 子过程,进而调用多达 8 个不同的子程序来显示格式化的字符串。最后,出口代码调用 3 个子程序恢复环境并且退回 DOS。这个程序的代码构架样本见图 3-2 所示。

hellocproc far 
 mov dx,DGROUP; dx == GROUP segment adr
 mov cs:DGROUP@@,dx 
 ; save several vectors and install default divide by zero handler 
 call SaveVectors 
 ; calculate environment size, determine amount of memory needed, 
 ; check size of the stack, return to DOS memory allocated in excess, 
 ; set far heap and program stack, reset uninitialized data area, 
 ; install floating point emulator 
 push cs 
 call ds:[__emu1st] 
 ; prepare main arguments 
 call _setargv@ 
 call _setenvp@ 
 ; initialize window sizes 
 call ds:[__crt1st] 
 ; invoke main(argc,argv,envp) 
 push word ptr environ@ 
 push word ptr _argv@ 
 push word ptr _argc@ 
 call main@; user's main() program
 ; flush and close streams and files 
 push ax 
 call exit@ 
hellocendp 

图 3-2: 一个“hello world”程序的代码构架

在一个二进制程序中,子程序是用它们的入口地址来标识的;子程序序没有与之关联的名称,而且在对这些子程序所定义和使用的寄存器做数据流分析之前,我们并不知道某个子程序是一个子过程还是一个函数。我们说,调用另一个子程序的子程序是 调用者 (caller),而被调用的子程序是 被调用者 (callee)。

3.1.1 栈框架

每一个子程序在运行时期间都关联一个栈框架。栈框架是参数、局部变量和返回地址 (调用者子程序中的地址) 的集合,如图 3-3 所示。在栈框架中参数表现子程序的一次特定调用的实际参数:在二进制文件中没有储存子程序形式参数的有关信息。栈标记(stack mark) 表示调用者里的返回地址 (以便在被调用者完成以后把控制传递给调用者),而调用者的框架指针 (在 Intel 体系结构中是寄存器 bp) 是在栈框架里面各偏移量的参照点。局部变量表现当子程序取得控制以后由它分配的空间;只有对于活动的 (即,未终止的) 子程序来说这个空间才是可用的。

图 3-3: 栈框架

当框架指针 (即寄存器 bp) 已经被设置以后,从框架指针起的正偏移存取参数和栈标记,而负偏移存取局部变量。在与栈架框有关的图中使用如下约定:在 Intel 体系结构里,栈从高内存向下往低内存增长。

栈框架也可能包含其它域,如图 3-4 所示。这些域不被所有语言或所有编译器使用的 [ASU86a]。返回值域在一些语言中给被调用者使用,以便函数返回数值给调用者;为了效率,更多地是在寄存器中返回这些数值。控制链指向调用者的栈框架,而存取链指向一个正在关闭的子程序的栈框架,其中保存它可以存取的非局部数据。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文