前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >函数调用约定

函数调用约定

作者头像
Elapse
发布2020-08-17 11:48:31
1.9K0
发布2020-08-17 11:48:31
举报
文章被收录于专栏:E条咸鱼

本篇原创作者:Rj45

背景

在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。

Add(10,20)

(x64架构的程序在使用寄存器传参的时候无需调整栈帧)

这种将函数参数顺序压入栈中以及进行栈帧调整的现象叫做函数调用约定。

函数调用约定

1、类型 函数调用约定有三种类型,分别为:

代码语言:javascript
复制
__cdecl
__stdcall
__fastcall

2、区别 _cdecl:是C或C++默认的函数调用方式,函数参数从右向左入栈,主调函数负责栈平衡。_stdcall:是Windows API默认方式,函数参数从右向左入栈,被调函数负责栈平衡。__fastcall:是一种快速调用方式,将参数优先从寄存器传入ecx和edx,剩下的参数再从右向左入栈,被调用函数恢复栈顶指针。

栈平衡

栈平衡,也叫esp定律或者堆栈平衡。其意思是,向堆栈中压入下一行程序的地址,当在进入子程序后进行反向运动的时候,可以恢复到原程执行的下一条指令地址位置。

样例分析

https://www.cnblogs.com/-qing-/p/10674223.html

https://jingyan.baidu.com/article/574c521958be5f6c8c9dc111.html

下期预告

got表和plt表在程序执行过程中的作用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 E条咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数调用约定
  • 栈平衡
  • 样例分析
  • 下期预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档