(栈帧和函数调用一)栈帧,函数调用与栈的关系

article/2025/10/18 19:34:38

(栈帧和函数调用一)栈帧,函数调用与栈的关系

  • 一,栈帧的介绍
  • 二,函数调用与栈的关系
  • 三,汇编演示
  • 四,总结

     在计算机科学中,栈是一个特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop),但栈容器必须准守一个规则:先入栈的数据后出栈(First In Last Out,FIFO)。
     在计算机系统中,栈是一个具有以上属性的动态内存区域(这里的动态指的是栈的空间可以动态增长或减小)。程序可以将数据压入栈中,也可以将数据从栈顶弹出。压栈使得栈空间增大,出栈使得栈空间减小。栈的空间总是自顶向下增长的(由高地址向低地址扩展)。

一,栈帧的介绍

     栈在程序空间中有着非常重要的地位,栈中保存了一个函数调用所需的维护信息,这就是我们常说的栈帧,栈帧一般包括以下几方面内容:
1) 函数的返回地址(用于返回函数调用处)和参数
2) 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量
3) 保存的上下文:包括在函数调用前后需要保持不变的寄存器。
     在i386中,一个函数的活动记录范围由ebp和esp两个寄存器来
划定,其中esp寄存器始终指向栈顶,同时也指向当前函数的活动记录的顶部;ebp寄存器指向栈底。ebp又被称为帧指针,esp被称为栈指针。
     栈帧是是相对于每一个函数调用而言的,是独立的。

二,函数调用与栈的关系

在这里插入图片描述
     一个函数的调用分为以下几步;
1) 将函数参数按照函数定义约定依次压入栈中(_stdcall,_cdcel等)
2) 将当前指令的下一条指令(也就是函数返回地址)压入栈中
3) 跳转到函数体执行函数
4) 栈帧调整:
a) Push ebp:将ebp压入栈中,(old ebp)
b) Move sbp,esp:将esp的值赋给ebp,这时ebp指向栈顶位置,而栈顶就是old ebp
c) Sub esp,XXX栈上分配临时空间,push XXX/pop XXX保存某些寄存器的值
d) mov eax, xxx:保存被调用函数的返回值到寄存器eax中
e) move esp,ebp:恢复esp栈顶指针,同时回收栈上的局部变量
f) pop ebp:恢复ebp栈底指针
g) ret:从栈中取出返回地址,并jump到该地址

三,汇编演示

     以一个简单的函数为例:

Int fun()
{return 1;
}

     对该函数反汇编结果如下:(vs编译器调试在函数入口处打断点,调试-窗口-反汇编)
在这里插入图片描述
     第1-2行,保存了旧的ebp,并让ebp指向当前的栈顶。
     第3行,将esp栈顶扩展了0XC0个字节,这一大段空出来的空间用来存储局部变量,临时数据或者调试信息。
     第4-6行,将ebx,esi,edi三个寄存器的值保存到了栈上,这三个寄存器的值在函数随后的执行中可能被修改,所以要先保存一下这些寄存器原本的值,以便退出函数时恢复。
     第7-12行,也就是return 1之前是一些调试信息,其中请注意有一步是将eax赋值为0xCCCCCCCC,而eax是用来接受函数返回值的寄存器。
     第13行,将函数返回值1赋值给eax寄存器。
     第14-16行,从栈上恢复ebx,esi,edi三个寄存器的值
     第17行,将esp值加上0XC0个字节,恢复到原先的栈顶
     第18-21行,ebp出栈,恢复原先的栈底
     第22行,使用ret指令返回。

四,总结

1,栈帧是一个函数活动的记录,通过栈帧我们可以进行函数调用参数传递,以及函数返回值调用路径的回溯。
2,函数的返回值是保存在eax寄存器中,在i386中,它是一个32位的寄存器,占4个字节(那么大于4个字节的函数返回值如何传递呢?本系列文章后续揭晓)
3,函数调用的过程中,有进行栈的扩容操作,用于存放函数的入参,临时变量等一些信息,当函数调用结束后,这一部分栈空间会通过栈顶指针(esp寄存器)的移动被回收掉。

参考文献:
1,《程序员的自我修养:链接、装载与库》第十章第二节


http://chatgpt.dhexx.cn/article/7Mmq5LXj.shtml

相关文章

理解栈帧和栈的运行原理

栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法 (Method) 和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧 F1,并被压入到栈中&…

函数栈帧的形成与释放

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转C语言 💬推荐一…

【函数栈帧的创建和销毁】(超详细图解)

想必大家在学完C语言函数章节之后,是否有这样的困惑: 局部变量是怎么创建的 ? 为什么局部变量的值是随机值 ? 函数是怎么传参的?传参的顺序又是什么样的 ? 形参和实参是什么关系 ? 函数调用…

C语言函数栈帧详解

系列文章目录 前言 最近正在学习栈帧方面的知识,由于本人对汇编不太熟悉,对其中频繁出现的ESP寄存器和EBP寄存器一直没搞清楚,在查找资料后,在此进行整理,方便以后温故知新。 一、预备知识 要清楚理解栈帧的概念&…

详解栈帧结构

https://www.1024do.com/?p367 栈帧结构 含义:C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程函数调用的一种数据结构。 从逻辑上讲,栈帧就是…

函数栈帧详解

目录 一.什么是函数栈帧 1.寄存器: 2.函数栈帧 3.栈帧的作用和维护 4.栈帧结构 二.函数栈帧的创建 1.汇编代码 2.main函数函数栈帧的创建 1.汇编语言讲解: 2.栈帧创建: 3.详细步骤 3.ADD函数栈帧的创建 栈帧创建: 3.函…

栈帧

首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操…

什么是函数栈帧

函数栈帧的创建与销毁 一、函数栈帧的创建1.寄存器2.函数栈帧3.函数中调用函数 二、函数栈帧的销毁总结 一、函数栈帧的创建 1.寄存器 一般来说,计算机中的寄存器有六种 分别是:eax, ebx, ecx,edx,ebp,esp 而ebp,esp这两个寄存器中存放的是地址&#…

栈帧 stack frame

栈帧 stack frame 每一次函数调用都会维护一个栈帧(stack frame),栈帧主要用于传递参数、保存返回地址、保存局部变量等。先直接上一个《深入理解计算机系统》上的原图。 其中,%rsp 指向栈顶位置,%rbp 指向栈底位置。…

C/函数栈帧

🌱博客主页:大寄一场. 🌱系列专栏:C语言学习笔记 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ​ 目录 前言 寄存器 1. 寄存器的种类与功能 C语言汇编指令介绍 函数栈帧的创建与销毁过程 1.函数栈帧的…

浅谈函数栈帧(Stack Frame)

💙作者:阿润菜菜 📖专栏:C 本文目录 什么是栈帧 在调试中观察 总结 什么是栈帧 那我们先来看看什么是栈: 栈(stack)是限定仅在表尾进行插入或者删除的线性表。栈是一种数据结构,它按照后进先出的原则存储…

栈和栈帧

栈 堆栈(stack)又称为栈或堆叠,是计算机科学里最重要且最基础的数据结构之一,它按照FILO(First In Last Out,后进先出)的原则存储数据。 栈的相关概念: 栈顶和栈底:允许元素插入与删除的一端…

函数栈帧的创建和销毁(图解)

目录 基础知识介绍1. 寄存器的种类与功能2. 常用汇编指令3. 内存模型 演示函数栈帧的创建销毁过程1. 为main()函数开辟栈帧2. 在main()函数中创建变量3. 调用Add()函数前的准备4. 为Add()函数开辟栈帧5. 在Add()函数中创建变量并运算6. Add()栈帧的销毁7. 返回main()函数栈帧 总…

运行时栈帧结构是怎样的?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 栈帧(Stack Frame)是J…

函数栈帧(详细图解)

目录 一、栈 二、常用寄存器及简单汇编指令 三、理解栈帧 3.1 main函数栈帧创建 3.1.1 main函数栈帧创建动态演示 3.2 局部变量创建 3.2.1 局部变量创建动态演示 3.3 函数传参与调用 3.3.1 函数传参 3.3.2 函数传参动态演示 3.3.3 函数调用 3.3.4 函数返回 四、END…

栈帧详解——C语言进阶

目录 传统艺能😎过渡区🤣正片开始👀寄存器👏main函数创建👏局部变量创建👏函数部分👏形参与实参👏 传统艺能😎 小编是大一菜鸟不赘述,欢迎大佬指点江山&…

栈帧结构详解

前言 Java虚拟机以方法作为基本的执行单位,“栈帧”是用于支持虚拟机进行方法调用和执行的数据结构,每一个方法从调用开始到执行结束,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程,栈帧也是虚拟机运行时数据区中虚拟机栈的栈…

浅谈栈帧

一、 什么是栈帧? 什么是栈帧,首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。 实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内…

栈帧(Stack Frame)

0x01.栈在计算机中的应用 在计算机系统中,栈也可以称之为栈内存是一个具有动态内存区域,存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且…

什么是栈帧

栈帧浅析 什么是栈帧 引用百度百科中的解释: 栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。函数的每次调用,都有它自己独立的栈帧。栈帧中维持着函数调用所需要的各种信息,包括函数的入参、函数的局部变…