【C语言】函数栈帧的创建和销毁(1)

article/2025/10/18 19:31:51

前言:

❓  在我们前期学习C语言时,你是否曾产生过很多困惑?

💭 比如:局部变量是怎么创建出来的?因为局部变量的值是随机值,我们建议将它初始化,那么为什么局部变量的值是随机值?函数是如何传递参数的?传参的顺序又是怎样的?形参和实参是什么样的关系? 函数的调用是怎样的一个过程?函数调用结束后是怎么返回的?

💡  如果这些问题 "成功" 难住了你,并且你好奇这到底是为什么,建议仔细阅读这篇文章,我们将讲解函数栈帧的创建和销毁。学习了函数的栈帧和销毁后,这些问题自然就能迎刃而解,而且还能增加自己的内功,对于后期学习更多的知识是很有帮助的!


一、预备知识

在讲解函数栈帧之前,我们先探讨该使用什么编译器来观察。其次,要想了解函数栈帧,我们还需要先了解一些必备的基础知识。

0x00 该选择何种编译器观察

📚 不要使用太高级的编辑器,因为高级的编译器中函数栈帧的过程封装得更加复杂,不容易在里面抽离出函数栈帧创建的过程。值得一提的是,在不同的编译器下函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。所以为了能够更好地观察和学习,我们将使用 VS2013 来进行学习和观察。

0x01 寄存器

❓ 什么是寄存器?

💡 我们在前面的章节就提到过寄存器的概念了。寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。寄存器有 eax、ebx、ecx、edx、ebp、esp等。

📚 每一个函数调用,都要在栈区上创建一个空间:

💬 测试代码:

#include <stdio.h>int Add(int x, int y) {return (x + y);
}int main(void) {int a = 10;int b = 20;int ret = 0;ret = Add(a, b);printf("%d\n", ret);return 0;
}

📚 在 VS2013 中,main函数也是被其他函数调用的:

      __tmainCRTStartup 👉 mainCRTstartup 👉 main

直接按 F10 开始调试,调试→窗口→反汇编

此时就可以看到汇编代码了:


未完待续


http://chatgpt.dhexx.cn/article/0EYBBSam.shtml

相关文章

函数栈帧(详解版)

文章目录 前言1.浅谈C语言内存1.1 内存分配1.2 栈1.3 寄存器 2. 为main()函数开辟栈帧3.变量的初始化及函数调用4.ADD函数4.1 ADD函数的创建4.2 ADD函数使用与销毁 5.总结 前言 前期学习的时候&#xff0c;我们可能有很多困感? 比如: ●局部变量是怎么创建的?I为什么局部变量…

也谈栈和栈帧

&#xfeff;&#xfeff; 一个码农要是没遇见过coredump&#xff0c;那他就是神仙了。core file(coredump的转储文件)中保存的最重要内容之一&#xff0c;就是函数的call trace。还原这部分内容 (栈回溯) &#xff0c;并与原代码对应上&#xff0c;尽快找出程序崩溃的位置和…

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

&#xff08;栈帧和函数调用一&#xff09;栈帧&#xff0c;函数调用与栈的关系 一&#xff0c;栈帧的介绍二&#xff0c;函数调用与栈的关系三&#xff0c;汇编演示四&#xff0c;总结 在计算机科学中&#xff0c;栈是一个特殊的容器&#xff0c;用户可以将数据压入栈中&#…

理解栈帧和栈的运行原理

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

函数栈帧的形成与释放

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转C语言 &#x1f4ac;推荐一…

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

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

C语言函数栈帧详解

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

详解栈帧结构

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

函数栈帧详解

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

栈帧

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

什么是函数栈帧

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

栈帧 stack frame

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

C/函数栈帧

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

浅谈函数栈帧(Stack Frame)

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

栈和栈帧

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

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

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

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

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和文献引用请见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语言进阶

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

栈帧结构详解

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