【转】_cdecl和_stdcall实例

        _cdecl和_stdcall的最大区别就是__cdecl是由调用者释放堆栈,而__stdcall由被调用者释放堆栈

        默认情况下,c/c++编译器都是_cdecl,除非显示指名为_stdcall。当然,一般在C/C++层次下,我们是不用关心具体这是怎么实现的,因为编译器已经帮助我们处理了,但是看看汇编代码有助于我们理解这两种函数调用方式是怎么回事。

_cdecl由主调函数清栈

//实例代码   _cdecl
#include<iostream>
using namespace std;
void add(int &a,int &b)
{
    a += b;
}
int main()
{
    int a = 3, b = 4;
    add(a , b);
    return 0;

}

add函数汇编代码如下:

00401390   push   %ebp
00401391   mov    %esp,%ebp
00401393   mov    0x8(%ebp),%ecx
00401396   mov    0x8(%ebp),%edx
00401399   mov    0xc(%ebp),%eax
0040139C   mov    (%eax),%eax
0040139E   add    (%edx),%eax
004013A0   mov    %eax,(%ecx)
004013A2   pop    %ebp
004013A3   ret   //木有自己清栈


_stdcall: 由被调函数自己清栈
//实例代码   _stdcall
#include<iostream>
using namespace std;
void _stdcall add(int &a,int &b)
{
    a += b;
}
int main()
{
    int a = 3, b = 4;
    add(a , b);
    return 0;

}

add汇编代码

00401390   push   %ebp
00401391   mov    %esp,%ebp
00401393   mov    0x8(%ebp),%ecx
00401396   mov    0x8(%ebp),%edx
00401399   mov    0xc(%ebp),%eax
0040139C   mov    (%eax),%eax
0040139E   add    (%edx),%eax
004013A0   mov    %eax,(%ecx)
004013A2   pop    %ebp
004013A3   ret    $0x8 //清除8个字节,add自己清栈
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值