C语言底层探索——函数栈帧空间的创建与销毁(附手写笔记)

发布时间:2026/10/22 13:12:08
C语言底层探索——函数栈帧空间的创建与销毁(附手写笔记) 目录引言前言须知一寄存器二汇编指令1.基础指令数据的搬运2.控制指令程序的指挥3.栈操作与算数指令三栈帧的创建四进入函数五栈帧的销毁六销毁解析七:延伸问题1.局部变量的创建2.返回值3.局部变量不初始化是随机数4.函数传参5.数据存储八:手写笔记引言“代码的本质不过是 CPU 执行的一条条机器指令而程序的运行不过是内存地址的不断偏移与覆盖。”当我们在黑框终端里按下回车一个普通的函数调用在底层究竟发生了什么从参数压栈、返回地址保存到栈帧的开辟、局部变量的分配再到最后的平栈与返回。这看似行云流水的几毫秒背后是 push、pop、call、ret 等汇编指令的精确协作。栈帧Stack Frame不仅是高级语言函数执行的基础载体更是理解递归、缓冲区溢出漏洞Stack Overflow Exploit以及逆向工程的敲门砖。本文将从零开始剥丝抽茧用图文笔记复原函数栈帧从创建到销毁的全生命周期。前言须知1.函数栈帧的创建与销毁在不同的编译器下会略有差异2.越高级的编译器在各种原因下封装越复杂难以观察3.该文章是基于VS 2013写的4.在VS 2013中main函数也是被其他函数调用的调用逻辑如下一寄存器寄存器分为多种eax,ebx,ecx,edx,ebp,esp等其中最重要的是ebp,espeax,ebx,ecx,edxeax累加器。专管数学运算比如加减乘除的核心参与者和结果存放地也是函数返回值的默认载体ebx基址寄存器。最开始专门用来存放内存地址的基准值类似于 ebpecx计数器。专管循环次数比如汇编里的 loop 指令默认使用 ecx 作为递减计数器edx数据寄存器。通常用来配合 eax 做大数运算比如乘法的高 32 位除法的余数ebp,espebp,esp中存放的是地址这两个地址是用来维护函数栈帧的两者联合使用来维护两个地址之间的函数栈帧从调用堆栈及反汇编中观察在调用哪个函数ebpexp就去维护哪个函数esp栈顶指针。永远指向当前栈的最顶端最低地址ebp栈底指针。在一个函数内它通常保持不变用来作为寻找参数和局部变量的“基准坐标”eipeip指令指针。永远指向 CPU 下一条要执行的指令地址二汇编指令1.基础指令数据的搬运mov把数据从一个地方搬到另一个地方寄存器到内存内存到寄存器寄存器到寄存器push将数据放入栈顶。底层动作是先将 esp 减 4因为栈向低地址生长然后将数据存入 esp 指向的新地址pop从栈顶取出数据。底层动作是将 esp 指向的数据读出然后将 esp 加 4lea计算内存地址并将其存入寄存器。它不读取内存里的值只算地址相当于C语言的 取地址符2.控制指令程序的指挥call是进入一个函数的号角。底层动作I.压栈把下一条指令的地址返回地址即 eip 的值压入栈中。II.跳转修改 eip 的值让 CPU 跳到被调用函数的入口地址去执行ret与 call 相对应结束函数调用。底层动作它从栈顶弹出一个值给 eip这就是 call 之前存进去的“返回地址”CPU 就会顺着这个地址回到主函数继续执行。jmp无条件跳转 / 根据标志位跳转如 je 相等跳转jne 不等跳转3.栈操作与算数指令sub/add减法 / 加法xor位运算leave这是汇编器为了方便提供的一个复合指令。它等价于两句指令I. mov esp, ebp 把栈顶指针直接拉回栈底位置瞬间回收所有局部变量空间。II.pop ebp 弹出原来的 ebp恢复上一层函数的栈底。nop空指令什么都不做占用 1 个字节int 3(0xCC)断点中断。CPU 执行到这里会暂停三栈帧的创建1.先在上个函数上压栈2.在压栈后执行mov开辟栈区空间3.初始化栈帧空间在其中加入随机值VS 2013上为C继续用mov等开辟局部变量的空间四进入函数1.压入ebx,esi,edi2.压入局部变量3.call指令下一条指令的地址4.记录ebp—main5.开辟函数空间栈帧创建五栈帧的销毁1.pop恢复调用前的值2.ret返回值3.mov把ebpesp移走六销毁解析通过pop把压栈的寄存器复原再由mov把espebp移走(回收)。实现销毁main提前把栈顶与栈底备份了ebpesp能再次找到故未销毁销毁:直接允许后续操作直接覆盖七:延伸问题1.局部变量的创建先建该函数调用的函数栈帧→初始化一部分→在栈帧空间中找到空间→把变量放进去2.返回值现将返回值放入寄存器中→回到函数→把值放到变量中3.局部变量不初始化是随机数随机值是给main函数(或其他函数)初始化时随机放的(每个编译器都有所不同)4.函数传参调函数时先把参数以push从右到左开始压栈压入→进入形参后通过指针偏移量找到压栈的参数(函数形参不在该内存栈帧内而是调用该函数的栈帧的扩展)5.数据存储数据可存储在三个地方(彼此相互独立)硬盘内存寄存器(寄存器是集成在CPU上的)八:手写笔记

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询