函数栈帧详解

article/2025/10/18 22:04:54

目录

一.什么是函数栈帧

1.寄存器:

2.函数栈帧

3.栈帧的作用和维护

4.栈帧结构

二.函数栈帧的创建

1.汇编代码

 2.main函数函数栈帧的创建

1.汇编语言讲解:

 2.栈帧创建:

 3.详细步骤

3.ADD函数栈帧的创建

栈帧创建:

3.函数栈帧的销毁

1.汇编语言讲解

 2.详细步骤

4.收获和问题

1.函数如何传参

2.函数返回值如何返回

3.函数中变量如何初始化和赋值

4.函数如何调用如何返回

5.函数执行结束后系统进行了什么操作


一.什么是函数栈帧

1.寄存器:

函数栈帧的创建和销毁离不开寄存器,了解函数栈帧之前先了解一下cpu中的寄存器。cpu中供应用程序员使用的寄存器主要有通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI),段寄存器(CS、DS、SS、ES、FS、GS),标志和控制寄存器(EIP、EFLAGS)。其中EBP一般用作基址指针,ESP一般用作堆栈指针。

2.函数栈帧

函数被调用时,系统会在栈区为该函数开辟一块栈空间,这个栈空间就是该函数的函数栈帧。以main函数的调用为例,main函数是被__tmainCRTStartup函数调用的,__tmainCRTStartup函数又是被mainCRTStartup函数调用的。当main函数被调用时就会在栈区为其开辟一块空间来用于main函数的执行。

3.栈帧的作用和维护

栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。从逻辑上讲,栈帧为一个函数提供了执行环境。栈是先用高地址再用低地址,栈帧控制和保存了一个函数所需要的各种信息。栈帧的维护离不开ebp和esp寄存器,ebp存放了指向栈帧的栈底地址的指针,esp则存放指向栈顶地址的指针

4.栈帧结构

栈帧就是栈区的一块空间而已,用main函数的栈帧示意图来说明一下吧。

有栈顶指针,栈底指针,栈区大小E4h个字节,栈帧内存放main函数的各种数据。

二.函数栈帧的创建

以一段代码为例(环境为VS2019)

#include <stdio.h>
int ADD(int x, int y) {int z = 0;z = x + y;return z;
}
int main() {int a = 10;int b = 20;int c = 0;c = ADD(a, b);printf("%d", c);return 0;
}

1.汇编代码

 要研究函数栈帧我们要研究c程序的汇编代码。如图所示:

 2.main函数函数栈帧的创建

1.汇编语言讲解:

 2.栈帧创建:

 3.详细步骤

 

 

 至此main函数的函数栈帧的创建和数据初始化就完成了。

3.ADD函数栈帧的创建

add函数栈帧的创建和main函数栈帧创建是一样的,需要注意的是,ADD函数执行结束后的返回值保存在了寄存器eax中,就是避免ADD函数栈帧销毁时,主函数无法访问ADD返回值。由此可见函数返回值是如何返回的。 

栈帧创建:

3.函数栈帧的销毁

以ADD函数函数栈帧的销毁为例

1.汇编语言讲解

 2.详细步骤

main函数函数栈帧的创建和销毁和ADD函数一样,就不再重复说了。

4.收获和问题

1.函数如何传参

以这一段代码为例

 

2.函数返回值如何返回

3.函数中变量如何初始化和赋值

4.函数如何调用如何返回

5.函数执行结束后系统进行了什么操作


http://chatgpt.dhexx.cn/article/YxN0sTcu.shtml

相关文章

栈帧

首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器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;栈帧也是虚拟机运行时数据区中虚拟机栈的栈…

浅谈栈帧

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

栈帧(Stack Frame)

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

什么是栈帧

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

【详解】函数栈帧——多图(c语言)

目录 前言 一.函数栈帧是什么&#xff1f; 二、栈帧准备知识 1.内存分区 2.什么是栈&#xff1f; 3.esp&#xff0c;ebp&#xff0c;eax寄存器 三、详解栈帧创建与销毁全过程 调用函数之前&#xff1a; 将传入函数的值放入栈中 函数执行&#xff1a; 1.保护当前ebp 2.…

【mcuclub】模数转换ADC0832

一、实物图 二、原理图 编号名称功能1CS片选使能&#xff0c;低电平芯片使能。2CH0模拟输入通道0&#xff0c;或作为IN/-使用。3CH1模拟输入通道1&#xff0c;或作为IN/-使用。4GND电源地5DI数据信号输入&#xff0c;选择通道控制。6DO数据信号输出&#xff0c;转换数据输出。7…

[技术讨论] [DDS] AD9833原理介绍及chiliDDS驱动分享(上)

​ 其实本文还有另一标题&#xff1a;《AD9833调不通&#xff1f;看这篇**就够了》 总觉字里行间隐隐霸气外露&#xff0c;不符合作者低调的风格&#xff0c;于是换了个朴素标题。标题狂不狂暂且不评&#xff0c;作者水平有限却是个事实&#xff1b;看到这篇**是你我缘分&…

ADC0832的使用

百度搜索ADC0832 Datasheet便可以免费获取该芯片的权威数据手册。 最重要的是查看它的时序及对应英文词组的意思。 CLK为时钟信号&#xff0c;需要外部输入&#xff0c;可直接与单片机引脚相连 Chip Select&#xff08;CS&#xff09;:从Timing图中可以看出芯片工作期间要保持…

ADC0832的AD模数转换原理及编程

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525;系列专栏&#xff1a;单片机设计专栏 目录 一、描述 二、模数转换原理&#xff1a; 三、模数转换的过程&#xff1a; 四、八位串行A/D转换器ADC0832简介&…

ADC0809的使用

一、前言介绍 使用ADC0809对一个模拟电压进行转换转换后的电压使用数码管显示出来 二、ADC0809的介绍 1、ADC0809简介 ADC0809是采用COMS工艺制造的双列直插式单片8位A/D转换器。分辨率8位&#xff0c;精度7位&#xff0c;带8个模拟量输入通道&#xff0c;有通道地址译码锁…