本篇原创作者:Rj45
背景
在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。
Add(10,20)
(x64架构的程序在使用寄存器传参的时候无需调整栈帧)
这种将函数参数顺序压入栈中以及进行栈帧调整的现象叫做函数调用约定。
1、类型 函数调用约定有三种类型,分别为:
__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表在程序执行过程中的作用
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有