函数栈帧

1. 全局观:


今天我们讲的是栈区,以下的图上方是低地址,下方是高地址,跟上图相反,因此使用顺序是从下方到上方,跟上图本质上一致。

2. 函数的调用关系

ebp,esp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。调用哪个函数就维护哪个函数栈帧

每一个函数调用都要在栈区开辟空间。
在VS2013中,main函数也是被其他函数调用的,调用关系如下图

3. 分析一段代码


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\n",c);return 0;
}

分析main函数的反汇编








到此为止,main函数开辟好了

Add函数调用前的准备

因此我们讲形参是实参的一份临时拷贝
存放call指令下一条指令的地址

调用Add函数
Add返回值
每pop一次esp往下方走一次


然后ebp和esp都回到了main函数开辟后的地方,再通过存着的地址找到了call的下一条语句再继续执行
然后把return的值赋值给c
打印出来就结束啦

4. 总结

这里我们可以了解到除了蹦出去还要留下地址供自己找回来
以及为什么不初始化的变量会打印出“烫烫烫”(因为开辟时会把空间初始化成cccccccc)
还有传值调用时形参是实参的一份拷贝,因此会比传指调用占用更多空间

希望大家能更深层理解函数栈帧创建和销毁

修炼内功——理解函数栈帧创建和销毁相关推荐

  1. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  2. 内功修炼-深入了解函数栈帧

    函数栈帧 基础铺垫 局部变量是怎么创建的 基础铺垫 函数栈帧的创建和销毁,在不同编译器,不同环境下有区别. 寄存器 eax ebx ecx edx ebp esp 要理解函数栈帧就必须理解 ebp e ...

  3. 【深入理解函数栈帧:探索函数调用的内部机制】

    本章我们要介绍的不是数学中的函数,而是C语言中的函数哟! 本章重点 了解汇编指令 深刻理解函数调用过程 样例代码: #include <stdio.h> int MyAdd(int a, ...

  4. 程序员内功心法之函数栈帧的创建和销毁

    目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3). ...

  5. 函数栈帧(详细图解)

    目录 一.栈 二.常用寄存器及简单汇编指令 三.理解栈帧 3.1 main函数栈帧创建 3.1.1 main函数栈帧创建动态演示 3.2 局部变量创建 3.2.1 局部变量创建动态演示 3.3 函数传 ...

  6. C语言内功修炼之函数栈帧的创建与销毁(举例加图解)

    大家可能会函数栈帧不了解,可能都没有听过这个,不用着急,在理解函数栈帧之前,我们先来了解一下程序对内存使用的分区大概情况:  区域 作用 栈区(stack) 由编译器自动分配和释放,存放函数的参数值, ...

  7. 程序员内功修炼——函数栈帧的创建与销毁

    一.什么是函数的栈帧 c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关. 函数栈帧:就是函数调用过程中程序的调用栈所开辟的空间,这些空间用来存放: 1 ...

  8. 内功修炼《函数栈帧的创建和销毁》建议收藏

    文章目录 前言 一. 寄存器的概念 二. 通用寄存器的结构 三. 指针寄存器和变址寄存器 四. EBP和ESP 五.总结 前言 在前期的学习过程中,我们可能会有很多的困惑: 1️⃣ 局部变量是怎么创建 ...

  9. (动图详解)汇编视角观察函数栈帧的创建和销毁

    目录 ​1.阅读本文的价值 ​2.函数栈帧及栈的概念 ​3.部分寄存器及汇编指令 ​4.main函数的调用 5.main函数的栈帧创建 ​6.变量的栈帧创建 ​6.函数传参 ​7.函数内部运算及销毁 ...

最新文章

  1. 三年后75%企业数据将移至云端?SAP新应用加速云服务
  2. Python遍历列表时删除元素
  3. 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
  4. C++类模板中的static成员
  5. 【代码笔记】iOS-实现网络图片的异步加载和缓存
  6. 云智慧完成D3轮6000万美元融资,继续领跑智能运维市场
  7. 全新安装2008操作系统和2008 server core核心安装
  8. 推荐 | 微软SAR近邻协同过滤算法相关问题(三)
  9. AlertManager实现webhook告警(使用Postman测试)
  10. java2048分析_Java版2048
  11. 【kuangbin】简单搜索 - 13.非常可乐【BFS】
  12. python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频
  13. 基于QT+Halcon实现拟合圆形
  14. python画红色填充三角形_用单独的颜色填充Matplotlib三元组中的三角形
  15. 批量复制提取Word中所有的表格到Excel(Python办公自动化)
  16. Pycharm 图像分辨率调整 学习笔记
  17. 计算机毕设Python+Vue疫情期间优化旅游平台(程序+LW+部署)
  18. php电影播放系统在线视频点播系统 php毕业设计题目课题选题 php毕业设计项目作品源码(1)功能模块概要
  19. 模拟QQ音乐微信登录界面
  20. 美通社企业新闻汇总 | 2019.3.5 | 天猫目标今年增1000个美妆品牌;特步设合资公司引进美国迈乐及圣康尼...

热门文章

  1. linux查询hba卡地址,怎样查看unix和linux的HBA卡的WWN地址
  2. 腾讯云5000亿元、阿里云2000亿元,都是投的啥?
  3. 新品周刊 | LINE FRIENDS李宁推出联名系列;FILA推出全新高级运动羽绒系列
  4. 抗病毒软件供应商担心恶意软件生产速度
  5. 二手电脑与Ubuntu的经历-2-显卡知识
  6. 考研日语线上笔记(三):初级日语语法总结20课
  7. 高级计算机维修员+职业资格证书查询,国家职业资格证书查询(全国联网)
  8. java将表情字符串转表情符号_使用java将字符串中的表情符号替换为字符串
  9. 艾默生流量计如何做好防爆工作
  10. 斯坦福ner python_斯坦福大学Corenlp和Java入门(Python程序员)