当前位置: 首页 > article >正文

函数调用时栈空间的变化

  1. 初始栈空间
    在这里插入图片描述

  2. 传参,通过push指令先将参数压入堆栈(c语言:从右向左压入)

在这里插入图片描述

  1. call指令函数入口地址(跳转到函数,并将下一条语句地址push到堆栈中)

  2. push ebp(保存栈底指针,用于后面恢复栈底)
    在这里插入图片描述

  3. mov ebp, esp(提升栈底指针,准备给函数分配栈空间)
    在这里插入图片描述

  4. sub esp, xxx(提升栈顶指针,开辟专属该函数的栈空间,共该函数局部变量使用)
    在这里插入图片描述

  5. push 寄存器(保存进入该函数前的寄存器的值,保证函数调用完后可以恢复原始值)
    在这里插入图片描述

  6. 执行函数代码

  7. pop 寄存器

在这里插入图片描述

  1. mov esp, ebp(降低栈顶指针,释放专属该函数的栈空间)
    在这里插入图片描述

  2. pop ebp(降低栈底指针,恢复成原始值)

  3. retn(pop eip,此时栈顶指针指向的位置刚好保存着进入函数之前的下一条语句的地址)

  4. add esp, xxx(由于调用函数前push参数导致栈顶指针提升,因此调用完要释放掉参数栈空间)
    在这里插入图片描述

问题:

  • 为什么要进行堆栈平衡?

因为Windows操作系统应用层堆栈大小默认是1M,每次调用函数都会开辟一段堆栈空间,用完如果不平衡,调用几次函数就凉凉了

  • 函数的返回值放哪里了?

大部分情况返回值会放到eax中,但不是绝对的。

  • 传参只能通过push到堆栈的方式吗?

也可以通过寄存器传参。

函数调用约定:

  • __cdecl: C/C++里中默认调用方式

特点1:push参数,顺序从右往左。
特点2:外部平衡堆栈。(即在retn之后(函数外部)释放参数栈空间)

  • __stdcall:windows API函数的调用方式 用了WINAPI的宏进行代替

特点1:push参数,顺序从右往左。
特点2:内部平衡堆栈。(即在retn之前(函数内部)释放参数栈空间)

  • __fastcall:快速调用方式 这种方式选择将参数优先从寄存器传入

特点1:寄存器传参,edx,ecx (如果参数多于2个,则用push),顺序从右向左
特点2:内部平衡堆栈。(即在retn之前(函数内部)释放参数栈空间)


http://www.kler.cn/a/6688.html

相关文章:

  • PCL 新增自定义点类型【2025最新版】
  • Linux安装Docker教程(详解)
  • MySQL数据表基本操作
  • 港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...
  • npm发布组件(vue3+webpack)
  • SpringMVC——原理简介
  • 三次迭代终放“大招”,Themis Pro版即将问世
  • 第09讲:Spring Data Redis(RedisTemplate)
  • pdf怎么转换成jpg图片?快来收藏这两种方法
  • 【图论刷题-6】力扣 797. 所有可能的路径
  • 【K3s】第31篇 详解 TDengine 集群扩容、缩容、清理
  • 工厂方法示例
  • CDH6.3.2大数据集群生产环境安装(五)之httpd和clouderManagerServer、agent组件安装
  • Java基础之Set
  • 2023蓝牙耳机哪个品牌的质量好?耐用的蓝牙耳机推荐
  • 《只有全力奔跑过才知道的事 》大迫杰
  • 【Linux】线程概念
  • 变量的作用域练习题-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第4章-课后作业)
  • Java判断请求是来自手机端还是PC端
  • select @@basedir;
  • pytorch中torch.cat() 和paddle中的paddle.concat()函数用法
  • CAD命令行怎么恢复到初始状态?CAD命令行窗口恢复步骤
  • IDEA 2023.1 正式发布,新特性简介
  • 【MySQL高级篇】 第10章_索引优化与查询优化
  • 【面试】业务中台是什么?
  • 3C认证是什么意思