【代码真相】之 函数调用方式 __cdecl & __stdcall

本文详细解析了C/C++中两种重要的函数调用约定:cdecl和stdcall。通过实际示例对比了这两种调用方式在参数传递过程中的不同之处,包括实参的压栈顺序、堆栈恢复操作等细节。

【代码真相】之 函数调用方式 __cdecl & __stdcall

1. __cdecl     C和C++缺省调用方式
实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复。由于主调用函数管理堆栈,所以可以实现变参函数。
示例:
void Input(int &m,int &n){}
int a =1, b=2;
Input(a,b);

Disassembly是这样的:
 Input(a,b);
004114EC  lea         eax,[b]        //将b的地址传给eax
004114EF  push        eax           //这两行完成参数b入栈 其实是地址入栈
004114F0  lea         ecx,[a]        //将c的地址传给ecx
004114F3  push        ecx           //这两行完成参数a入栈 其实是地址入栈
004114F4  call        Input (4111E5h)  //调用Input函数
004114F9  add         esp,8         //恢复栈

思考:如果写成void Input(int m, int n){}是什么样的呢?
Input(a,b);
004114EC  mov         eax,dword ptr [b]  //将2入栈
004114EF  push        eax 
004114F0  mov         ecx,dword ptr [a]
004114F3  push        ecx 
004114F4  call        Input (4111EAh)
004114F9  add         esp,8
知道传值和传引用传地址的区别了吧。

2. __stdcall   CALLBACK
实参的压栈顺序是从右到左,调用返回时,堆栈由被调函数调整。
Input(a,b);
004114EC  lea         eax,[b]
004114EF  push        eax 
004114F0  lea         ecx,[a]
004114F3  push        ecx 
004114F4  call        Input (4111FEh)
可以看出来,在调用函数Input之后,没有相应的堆栈恢复工作

转载于:https://www.cnblogs.com/DylanWind/archive/2008/12/04/1347811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值