| |
|
|
开发:
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语言】函数栈帧的创建和销毁(1) -> 正文阅读 |
|
|
[C++知识库]【C语言】函数栈帧的创建和销毁(1) |
前言:?? 在我们前期学习C语言时,你是否曾产生过很多困惑? 💭 比如:局部变量是怎么创建出来的?因为局部变量的值是随机值,我们建议将它初始化,那么为什么局部变量的值是随机值?函数是如何传递参数的?传参的顺序又是怎样的?形参和实参是什么样的关系? 函数的调用是怎样的一个过程?函数调用结束后是怎么返回的? 💡? 如果这些问题 "成功" 难住了你,并且你好奇这到底是为什么,建议仔细阅读这篇文章,我们将讲解函数栈帧的创建和销毁。学习了函数的栈帧和销毁后,这些问题自然就能迎刃而解,而且还能增加自己的内功,对于后期学习更多的知识是很有帮助的! 一、预备知识
0x00 该选择何种编译器观察📚 不要使用太高级的编辑器,因为高级的编译器中函数栈帧的过程封装得更加复杂,不容易在里面抽离出函数栈帧创建的过程。值得一提的是,在不同的编译器下函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。所以为了能够更好地观察和学习,我们将使用 VS2013 来进行学习和观察。
0x01 寄存器? 什么是寄存器? 💡 我们在前面的章节就提到过寄存器的概念了。寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。寄存器有 eax、ebx、ecx、edx、ebp、esp等。
📚 每一个函数调用,都要在栈区上创建一个空间:
💬 测试代码:
📚 在 VS2013 中,main函数也是被其他函数调用的: ????? __tmainCRTStartup 👉 mainCRTstartup 👉 main 直接按 F10 开始调试,调试→窗口→反汇编
此时就可以看到汇编代码了:
未完待续 |
|
|
| 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年10日历 | -2025/10/24 16:16:25- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |