| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 【C语言初阶】函数栈帧的创建与销毁 -> 正文阅读 |
|
[C++知识库]【C语言初阶】函数栈帧的创建与销毁 |
本篇文章,博主所使用的环境是VS2013,建议在学习函数栈帧的创建与销毁不要使用太高级的编译器,越高级的编译器,越不容易观察函数栈帧创建与销毁的过程。同时函数栈帧的创建和销毁的过程在不同的编译器下,它的创建和销毁是略有差异的,大体逻辑是一致的,具体细节取决于编译器的实现。 在了解函数栈帧的创建与销毁之前我们先了解一下什么是函数栈帧。
接下来我们就开始学习函数栈帧的创建和销毁吧。 铺垫: 下面会进行详细讲解: 接下来我们用一个简单的代码来进行讲解:
调试程序查看堆栈: 接着转到反汇编: 接下来我们对函数栈帧的创建和销毁一步一步进行说明: 2.main函数栈帧的创建:
push是压栈的意思:将ebp进行压栈处理(把ebp放入栈顶),压栈后,esp自动指向栈顶:
mov是赋值的意思:将esp的值给ebp,此时产生新的ebp,即ebp指向esp指向的位置:
sub为减的意思,将esp-0E4h的值赋给esp,且函数调用分配由高地址向低地址增长,因此esp向上移动,即开辟了新空间:
三个push压栈,分别将ebx,esi,edi按顺序压入栈顶,而esp也会自动指向栈顶:
lea的意思是加载有效地址:将ebp-0E4h的有效地址加载到edi中; 我们来看看它们在内存中是如何存储的:
1.把ebp-14h所在地址的值,也就是b的值,放入eax这个寄存器中,然后对eax进行压栈; 2、然后把ebp-8所在地址的值,也就是a的值,放入ecx这个寄存器中,然后接着对ecx进行压栈; 3.call的作用是调用函数区:将下一条指令的地址压栈,然后进入add函数里面。
接着按F11进入Add函数中: 如图: 这样就完成了相加的过程。 接下来就是要将相加的值返回去,也就是返回z的值。 首先把ebp-8里的值(z的值)放到eax寄存器里面去。因为函数调用完后,而为函数所开辟的函数栈帧会被销毁,但寄存器不会随着程序的退出而销毁,所以这样就可以将值返回去。 然后接着看下面的指令: 三个pop: pop是出栈操作,将edi esi ebx依次从上向下出栈,esp自动下移动。 把esp+8,即esp向下移,把形参销毁 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 11:09:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |