用户操作
[即时聊天] [发私信] [加为好友]
noiseID:zzm7000
7759次访问,排名14296(2),好友0人,关注者0人。
zzm7000的文章
原创 6 篇
翻译 0 篇
转载 0 篇
评论 1 篇
最近评论
文章分类
收藏
    相册
    Links
    Insecure.Org
    Mindview.net
    夜游之——葡萄唐
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 __cdecl,__stdcall和__fastcall收藏

    新一篇: C++对象大小讨论 | 旧一篇: 开始写代码了

      __cdecl  is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code.
      The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.
      一下实验实验三种调用方式:
    #include <iostream>
    #include <string>
    using std::cout;
    using std::endl;using std::string;

    int __stdcall maxs(int a,int b)

     return a>b?a:b;
    }
    int __cdecl maxc(int a,int b)
    {
     return a>b?a:b;
    }
    int __fastcall maxi(int a,int b)
    {
     return a>b?a:b;
    }
    int main()
    {
     maxs(1,2);
     maxc(2,3);
     maxi(3,4);
    }
    反汇编代码:
    int main()
    {
    00411B60  push        ebp 
    00411B61  mov         ebp,esp
    00411B63  sub         esp,0C0h
    00411B69  push        ebx 
    00411B6A  push        esi 
    00411B6B  push        edi 
    00411B6C  lea         edi,[ebp-0C0h]
    00411B72  mov         ecx,30h
    00411B77  mov         eax,0CCCCCCCCh
    00411B7C  rep stos    dword ptr [edi]
     maxs(1,2);
    00411B7E  push        2   
    00411B80  push        1   
    00411B82  call        maxs (4110D2h)
     maxc(2,3);
    00411B87  push        3   
    00411B89  push        2   
    00411B8B  call        maxc (411361h)
    00411B90  add         esp,8
     maxi(3,4);
    00411B93  mov         edx,4
    00411B98  mov         ecx,3
    00411B9D  call        maxi (411519h)
    }int main()
    {
    00411B60  push        ebp 
    00411B61  mov         ebp,esp
    00411B63  sub         esp,0C0h
    00411B69  push        ebx 
    00411B6A  push        esi 
    00411B6B  push        edi 
    00411B6C  lea         edi,[ebp-0C0h]
    00411B72  mov         ecx,30h
    00411B77  mov         eax,0CCCCCCCCh
    00411B7C  rep stos    dword ptr [edi]
     maxs(1,2);
    00411B7E  push        2   
    00411B80  push        1   
    00411B82  call        maxs (4110D2h)
     maxc(2,3);
    00411B87  push        3   
    00411B89  push        2   
    00411B8B  call        maxc (411361h)
    00411B90  add         esp,8
     maxi(3,4);
    00411B93  mov         edx,4
    00411B98  mov         ecx,3
    00411B9D  call        maxi (411519h)
    }
    int __stdcall maxs(int a,int b)

    00411A30  push        ebp 
    00411A31  mov         ebp,esp
    00411A33  sub         esp,0C4h
    00411A39  push        ebx 
    00411A3A  push        esi 
    00411A3B  push        edi 
    00411A3C  lea         edi,[ebp-0C4h]
    00411A42  mov         ecx,31h
    00411A47  mov         eax,0CCCCCCCCh
    00411A4C  rep stos    dword ptr [edi]
     return a>b?a:b;
    00411A4E  mov         eax,dword ptr [a]
    00411A51  cmp         eax,dword ptr [b]
    00411A54  jle         maxs+31h (411A61h)
    00411A56  mov         ecx,dword ptr [a]
    00411A59  mov         dword ptr [ebp-0C4h],ecx
    00411A5F  jmp         maxs+3Ah (411A6Ah)
    00411A61  mov         edx,dword ptr [b]
    00411A64  mov         dword ptr [ebp-0C4h],edx
    00411A6A  mov         eax,dword ptr [ebp-0C4h]
    }
    00411A70  pop         edi 
    00411A71  pop         esi 
    00411A72  pop         ebx 
    00411A73  mov         esp,ebp
    00411A75  pop         ebp 
    00411A76  ret         8   
    int __cdecl maxc(int a,int b)
    {
    00411A90  push        ebp 
    00411A91  mov         ebp,esp
    00411A93  sub         esp,0C4h
    00411A99  push        ebx 
    00411A9A  push        esi 
    00411A9B  push        edi 
    00411A9C  lea         edi,[ebp-0C4h]
    00411AA2  mov         ecx,31h
    00411AA7  mov         eax,0CCCCCCCCh
    00411AAC  rep stos    dword ptr [edi]
     return a>b?a:b;
    00411AAE  mov         eax,dword ptr [a]
    00411AB1  cmp         eax,dword ptr [b]
    00411AB4  jle         maxc+31h (411AC1h)
    00411AB6  mov         ecx,dword ptr [a]
    00411AB9  mov         dword ptr [ebp-0C4h],ecx
    00411ABF  jmp         maxc+3Ah (411ACAh)
    00411AC1  mov         edx,dword ptr [b]
    00411AC4  mov         dword ptr [ebp-0C4h],edx
    00411ACA  mov         eax,dword ptr [ebp-0C4h]
    }
    00411AD0  pop         edi 
    00411AD1  pop         esi 
    00411AD2  pop         ebx 
    00411AD3  mov         esp,ebp
    00411AD5  pop         ebp 
    00411AD6  ret       
    int __fastcall maxi(int a,int b)
    {
    00411AF0  push        ebp 
    00411AF1  mov         ebp,esp
    00411AF3  sub         esp,0DCh
    00411AF9  push        ebx 
    00411AFA  push        esi 
    00411AFB  push        edi 
    00411AFC  push        ecx 
    00411AFD  lea         edi,[ebp-0DCh]
    00411B03  mov         ecx,37h
    00411B08  mov         eax,0CCCCCCCCh
    00411B0D  rep stos    dword ptr [edi]
    00411B0F  pop         ecx 
    00411B10  mov         dword ptr [ebp-14h],edx
    00411B13  mov         dword ptr [ebp-8],ecx
     return a>b?a:b;
    00411B16  mov         eax,dword ptr [a]
    00411B19  cmp         eax,dword ptr [b]
    00411B1C  jle         maxi+39h (411B29h)
    00411B1E  mov         ecx,dword ptr [a]
    00411B21  mov         dword ptr [ebp-0DCh],ecx
    00411B27  jmp         maxi+42h (411B32h)
    00411B29  mov         edx,dword ptr [b]
    00411B2C  mov         dword ptr [ebp-0DCh],edx
    00411B32  mov         eax,dword ptr [ebp-0DCh]
    }
    00411B38  pop         edi 
    00411B39  pop         esi 
    00411B3A  pop         ebx 
    00411B3B  mov         esp,ebp
    00411B3D  pop         ebp 
    00411B3E  ret   

    发表于 @ 2006年03月28日 20:10:00|评论(loading...)|编辑

    新一篇: C++对象大小讨论 | 旧一篇: 开始写代码了

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © noise