C语言初学者自学整理了一天的函数栈帧的创建和销毁,求康康ヾ(^▽^*)))

本文详细探讨了C语言中函数栈帧的创建和销毁过程,通过讲解压栈、出栈、寄存器的概念,特别是ebp和esp的作用,解释了函数调用时参数传递、局部变量创建及内存回收的原理。并通过反汇编代码分析了VS2013下函数调用的具体步骤,阐述了形参和实参的关系以及函数调用的返回机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前C语言学习的时候,可能我们或多或少都会有下面的困惑:

局部变量是怎么创建的?

为什么局部变量的值是随机值?

函数是怎么传参的?传参的顺序是怎样的?

形参和实参是什么关系?

函数调用是怎么做的?

函数调用时结束后时怎么返回的?

要想弄懂以上问题,那么学习函数栈帧的创建与销毁必不可少

(注:在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现)

首先来看这样几个概念:

压栈:给栈增加一个元素(在栈顶往上放元素

出栈:从栈顶删除一个元素

寄存器

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

依照《C语言深度剖析》这本书中的说法,CPU相当于皇帝,内存相当于大臣,寄存器就是皇帝身边的小太监(。・∀・)ノ(先不考虑CPU的高速缓冲区)数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU并不直接和内存打交道。

那么为什么要这么麻烦?因为速度!寄存器其实就是一块一块小的存储空间,只不过存取速度比内存快得多。它离CPU很近,CPU一伸手就拿到数据了,比在那么大一块内存里去依照地址寻找数据快多了。

寄存器种类,大家之前可能听说过eax,ebx,ecx,edx;但是今天我们的重点在ebp和esp这两种。esp ebp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。

每一个函数调用,都要在栈区创建一块空间,以Add函数举例

我们可以画出栈区,调用main函数我们需要为它在栈区创建一块空间,其中蓝色区域即为main函数的函数栈帧,那么这块空间是由谁来维护的呢?这时候就

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拍拍脑袋瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值