首页 > 编程语言 >【c++】函数调用机制

【c++】函数调用机制

时间:2025-01-15 16:30:30浏览次数:3  
标签:函数 esp 局部变量 c++ 主调 地址 ebp 函数调用 机制

【c++】函数调用机制

1.建立栈帧空间
2.传递数据,为局部变量分配空间
3.保护现场,主调函数运行状态和返回值地址入栈
4.执行被调函数体
5.释放局部变量的栈空间
6.恢复现场,取主调函数运行状态和返回值地址
7.继续执行主调函数后续语句

详细介绍:
ebp esp eax 等均是寄存器

1. 建立栈帧空间:

当函数被调用时,操作系统会为该函数分配一个 栈帧(esp(低地址 栈顶) ebp(高地址 栈底)),这是函数的局部空间。

2. 传递数据,为局部变量分配空间:

函数的 参数(如果有)会传递到栈帧中(esp向上移动)。
此外,函数的 局部变量 也会在栈帧中分配空间。局部变量的空间在栈上分配,而不是在堆或其他地方。

3. 保护现场,主调函数运行状态和返回值地址入栈:

主调函数的 运行状态(下一步执行语句的地址)和 返回地址(ebp地址)会被保存在栈帧中。
esp向上抬升44h 将原本esp地址给ebp 此时esp和ebp指向中间位置就是新栈帧空间 并使用cccc填充)

4. 执行被调函数体:

现在,被调函数的代码开始执行。
若有返回值 使用eax保存

5. 释放局部变量的栈空间:

当函数执行完毕后,它的 局部变量 被销毁,栈空间被释放。
此时,栈指针会回到被调函数调用前的位置,局部变量空间被清空。

6. 恢复现场,取主调函数运行状态和返回值地址:

恢复主调函数的 寄存器状态,确保主调函数继续从上次暂停的位置执行。(ebp给esp ebp原本的值从栈中获取
恢复 返回地址,指向主调函数调用时的下一条指令地址。

7. 继续执行主调函数后续语句:

主调函数在栈帧被清除后,继续执行其后续的语句。
程序控制流会跳转到主调函数中返回地址的位置。

标签:函数,esp,局部变量,c++,主调,地址,ebp,函数调用,机制
From: https://blog.csdn.net/m0_64014551/article/details/145162671

相关文章

  • 【c++】【Linux】堆和栈的区别
    【c++】【Linux】堆和栈的区别区别堆栈管理方式由程序员手动分配手动释放由系统自动管理生长方式从低地址向高地址增长从高地址向低地址增长空间大小32位linux下可占2.9G左右32位Linux下占10M左右windows下占1M左右存储内容动态分配的内存,常用于存储链表、对象等动态数据......
  • C++搜索问题
    C++中的搜索算法是指在数据结构或图中寻找某些特定元素或满足条件的路径的算法。搜索算法广泛应用于问题求解、路径规划、数据检索等领域。常见的搜索算法可以分为两大类:无权搜索算法:如深度优先搜索(DFS)、广度优先搜索(BFS)。启发式搜索算法:如A算法、双向搜索、IDA算法等。1.......
  • 2025-1-15-十大经典排序算法 C++与python
    文章目录十大经典排序算法比较排序1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序非比较排序8.计数排序9.桶排序10.基数排序十大经典排序算法十大经典排序算法可以分为比较排序和非比较排序:前者包括冒泡排序、选择排序、插......
  • c++&& SDK打包过程
     在C++中,SDK(SoftwareDevelopmentKit)打包工具的选择和使用通常取决于您的具体需求和目标平台。以下是一个详细的步骤描述,用于创建和打包一个C++SDK。这里我们假设您已经有一个C++项目需要打包为SDK。步骤一:准备你的C++项目项目结构规划:确定你的SDK包含哪些功能,比如源代......
  • Effective C++ 之【条款7:为多态基类声明virtual析构函数】
    文章目录Tips1Tips2一、为什么要有virtual析构函数?二、为什么有时候不要声明虚构函数?三、使用一下纯虚函数。TodayThinking~Tips1polymorphic(带有多态性质的)baseclasses应该声明一个virtual的虚构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构......
  • gesp(C++五级)(5)洛谷:B3929:[GESP202312 五级] 小杨的幸运数
    gesp(C++五级)(5)洛谷:B3929:[GESP202312五级]小杨的幸运数题目描述小杨认为,所有大于等于aaa的完全平方数都是他的超级幸运数。小杨还认为,所有超级幸运数的倍数都是他......
  • gesp(C++五级)(6)洛谷:B3930:[GESP202312 五级] 烹饪问题
    gesp(C++五级)(6)洛谷:B3930:[GESP202312五级]烹饪问题题目描述有NNN种食材,编号从00......
  • Tauri教程-进阶篇-第二节 命令机制
    “如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》“有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》“维持现状意味着空耗你的努力和生命。”——纪伯伦Tauri技术教程*第五章Tauri的进阶教程第二节命令机制一.......
  • C++ 和 Tesseract OCR 识别验证码
    安装TesseractOCR首先,我们需要安装TesseractOCR。根据不同操作系统进行安装。在Ubuntu上安装:bashsudoaptupdatesudoaptinstalltesseract-ocrsudoaptinstalllibleptonica-devsudoaptinstalllibtesseract-dev在Windows上安装:下载TesseractOCR的Wi......
  • 【C++】反向迭代器
    反向迭代器一.源码及框架分析二.反向迭代器实现代码1.ReverseIterator.h2.Vector.h3.List.h4.Test.cpp一.源码及框架分析SGI-STL30版本源代码,反向迭代器实现的核心源码在stl_iterator.h中,反向迭代器是一个适配器,各个容器中再适配出自己的反向迭代器。下面截出vector......