修炼内功——理解函数栈帧创建和销毁
函数栈帧
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)
还有传值调用时形参是实参的一份拷贝,因此会比传指调用占用更多空间
希望大家能更深层理解函数栈帧创建和销毁
修炼内功——理解函数栈帧创建和销毁相关推荐
- 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁
上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...
- 内功修炼-深入了解函数栈帧
函数栈帧 基础铺垫 局部变量是怎么创建的 基础铺垫 函数栈帧的创建和销毁,在不同编译器,不同环境下有区别. 寄存器 eax ebx ecx edx ebp esp 要理解函数栈帧就必须理解 ebp e ...
- 【深入理解函数栈帧:探索函数调用的内部机制】
本章我们要介绍的不是数学中的函数,而是C语言中的函数哟! 本章重点 了解汇编指令 深刻理解函数调用过程 样例代码: #include <stdio.h> int MyAdd(int a, ...
- 程序员内功心法之函数栈帧的创建和销毁
目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3). ...
- 函数栈帧(详细图解)
目录 一.栈 二.常用寄存器及简单汇编指令 三.理解栈帧 3.1 main函数栈帧创建 3.1.1 main函数栈帧创建动态演示 3.2 局部变量创建 3.2.1 局部变量创建动态演示 3.3 函数传 ...
- C语言内功修炼之函数栈帧的创建与销毁(举例加图解)
大家可能会函数栈帧不了解,可能都没有听过这个,不用着急,在理解函数栈帧之前,我们先来了解一下程序对内存使用的分区大概情况: 区域 作用 栈区(stack) 由编译器自动分配和释放,存放函数的参数值, ...
- 程序员内功修炼——函数栈帧的创建与销毁
一.什么是函数的栈帧 c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关. 函数栈帧:就是函数调用过程中程序的调用栈所开辟的空间,这些空间用来存放: 1 ...
- 内功修炼《函数栈帧的创建和销毁》建议收藏
文章目录 前言 一. 寄存器的概念 二. 通用寄存器的结构 三. 指针寄存器和变址寄存器 四. EBP和ESP 五.总结 前言 在前期的学习过程中,我们可能会有很多的困惑: 1️⃣ 局部变量是怎么创建 ...
- (动图详解)汇编视角观察函数栈帧的创建和销毁
目录 1.阅读本文的价值 2.函数栈帧及栈的概念 3.部分寄存器及汇编指令 4.main函数的调用 5.main函数的栈帧创建 6.变量的栈帧创建 6.函数传参 7.函数内部运算及销毁 ...
最新文章
- 三年后75%企业数据将移至云端?SAP新应用加速云服务
- Python遍历列表时删除元素
- 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
- C++类模板中的static成员
- 【代码笔记】iOS-实现网络图片的异步加载和缓存
- 云智慧完成D3轮6000万美元融资,继续领跑智能运维市场
- 全新安装2008操作系统和2008 server core核心安装
- 推荐 | 微软SAR近邻协同过滤算法相关问题(三)
- AlertManager实现webhook告警(使用Postman测试)
- java2048分析_Java版2048
- 【kuangbin】简单搜索 - 13.非常可乐【BFS】
- python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频
- 基于QT+Halcon实现拟合圆形
- python画红色填充三角形_用单独的颜色填充Matplotlib三元组中的三角形
- 批量复制提取Word中所有的表格到Excel(Python办公自动化)
- Pycharm 图像分辨率调整 学习笔记
- 计算机毕设Python+Vue疫情期间优化旅游平台(程序+LW+部署)
- php电影播放系统在线视频点播系统 php毕业设计题目课题选题 php毕业设计项目作品源码(1)功能模块概要
- 模拟QQ音乐微信登录界面
- 美通社企业新闻汇总 | 2019.3.5 | 天猫目标今年增1000个美妆品牌;特步设合资公司引进美国迈乐及圣康尼...
热门文章
- linux查询hba卡地址,怎样查看unix和linux的HBA卡的WWN地址
- 腾讯云5000亿元、阿里云2000亿元,都是投的啥?
- 新品周刊 | LINE FRIENDS李宁推出联名系列;FILA推出全新高级运动羽绒系列
- 抗病毒软件供应商担心恶意软件生产速度
- 二手电脑与Ubuntu的经历-2-显卡知识
- 考研日语线上笔记(三):初级日语语法总结20课
- 高级计算机维修员+职业资格证书查询,国家职业资格证书查询(全国联网)
- java将表情字符串转表情符号_使用java将字符串中的表情符号替换为字符串
- 艾默生流量计如何做好防爆工作
- 斯坦福ner python_斯坦福大学Corenlp和Java入门(Python程序员)