当前位置: 首页 > news >正文

【C语言】函数栈帧的创建与销毁

目录

一、两个特别的寄存器

二、在函数调用时发生的事

先开辟空间

再进行实参与形参的传递

然后执行函数的调用

之后将返回值存储在寄存器中(eax)带回去

最后通过留下的锚点返回调用函数的位置


在不同的编译器下,函数调用过程中栈帧的创建是略有差异的

栈区使用时是从高地址向低地址使用

堆区使用时是从低地址向高地址使用

一、两个特别的寄存器

每一个函数的调用都要在栈区开辟一块空间,栈区的使用习惯是从高地址往低地址使用

栈底指针寄存器ebp和栈顶指针寄存器esp这两个寄存器中存放的是地址,这两个地址是用来指明当前函数所在的内存空间的底和顶,当前程序正在执行哪个函数,ebp和esp就维护哪个函数的栈帧

  • ebp:栈底指针寄存器
  • esp:栈顶指针寄存器,在正常使用时每压入一个数据,指针指向就会往低地址移动一位

二、在函数调用时发生的事

先开辟空间

  • 栈底指针ebp压入上一个函数所开辟的栈,此时栈顶指针esp指向栈底指针ebp
  • 将栈底指针ebp指向当前的栈顶指针esp,此时出现了新的空间的栈底
  • 栈顶指针esp减去一个值(由编译器决定),即栈顶指针往低地址移动,此时出现了新的空间的栈顶

由此为当前调用的函数开辟出了一块新的内存空间

再将所开辟的空间初始化(这也是为什么一个变量如果不初始化直接拿来使用可能会出问题的原因)

然后在所开辟的空间内为变量分配空间,之后该空间可以自由存储值(如果在创建变量时不初始化,那么这个变量的默认值就是内存空间初始化后存放的值,比如VS里的0xcccccccc)

如果创建多个变量,那么变量会从栈底(高地址)依次向栈顶(高地址)使用先前所开辟的空间

再进行实参与形参的传递

实参变量创建好后,将实参地址下的值再创建一份压入为主函数开辟的栈区成为形参空间,然后继续压入程序目前的栈底地址和创建形参变量之前的栈顶地址(为了方便后续函数的返回和形参空间的释放)

然后执行函数的调用

先重复空间的开辟和初始化,再将main函数栈顶的备份实参值(即形参)读取出来(例如:ebp+8,读本次函数空间栈底再往高的地址,即前一个调用该函数的空间下的值)进行运算

之后将返回值存储在寄存器中(eax)带回去

因为函数变量的空间离开函数就销毁了,所以借用寄存器存储返回值

最后通过留下的锚点返回调用函数的位置

并且将被调用函数的空间释放掉,将eax存储的返回值赋给main函数用于接收的变量

http://www.dtcms.com/a/354758.html

相关文章:

  • 引入资源即针对于不同的屏幕尺寸,调用不同的css文件
  • 开发避坑指南(41):Vue3 提示框proxy.$modal.msgSuccess()提示文本换行解决方案
  • 腾讯混元开源视频拟音模型,破解 AI 视频 “无声” 难题
  • vscode 远程ssh登录免手动输入密码
  • 20.22 QLoRA微调实战:中文语音识别数据准备全流程解密
  • 音合成之二十四 微软VibeVoice语音合成模型
  • 2025通用证书研究:方法论、岗位映射与四证对比
  • 【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)
  • Unity 打包 iOS,Xcode 构建并上传 App Store
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式电源接入与电力系统稳定性维护中的应用(404)
  • mac中进行适用于IOS的静态库构建
  • 【大前端】React Native 调用 Android、iOS 原生能力封装
  • 基于FPGA的情绪感知系统设计方案:心理健康监测应用(五)
  • Ckman部署clickhouse
  • Qt基础_xiaozuo
  • Groovy集合常用简洁语法
  • linux mysql 数据库启动异常问题记录
  • KafKa学习笔记
  • AT_abc407_e [ABC407E] Most Valuable Parentheses
  • 前端开发中的CSS变量管理:实现缓存与响应式更新
  • 从 WPF 到 Avalonia 的迁移系列实战篇3:ResourceDictionary资源与样式的差异与迁移技巧
  • CuTe C++ 简介01,从示例开始
  • wpf之ListBox
  • 一个客户端直接掉线或断点,服务器怎么快速识别
  • 通过代码认识 CNN:用 PyTorch 实现卷积神经网络识别手写数字
  • audioMAE模型代码分析
  • 循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM)
  • 深度学习——卷积神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • SpringBoot项目使用Liquibase 数据库版本管理
  • Day16_【机器学习—KNN算法】