调用约定

常见的几种调用约定

调用约定      参数压栈顺序      平衡堆栈

__cdecl     从右至左入栈  调用者清理栈

__stdcall   从右至左入栈  自身清理堆栈

__fastcall  ECX/EDX传送前两个    自身清理堆栈
            剩下:从右至左入栈   
            你希望很快,所以定义在2个参数内,参数超过2个,就不是很快了,也是用堆栈传参部分。   
  1. _cdecl
   291:     int r1 = Plus1(1,2);     
004119D8  push        2  
004119DA  push        1  
004119DC  call        0041114A  
004119E1  **add         esp,8**  
----------
  70: int  __cdecl Plus1(int x, int y)
  71: {
004114C0  push        ebp  
004114C1  mov         ebp,esp  
004114C3  sub         esp,0C0h  
004114C9  push        ebx  
004114CA  push        esi  
004114CB  push        edi  
004114CC  lea         edi,[ebp+FFFFFF40h]  
004114D2  mov         ecx,30h  
004114D7  mov         eax,0CCCCCCCCh  
004114DC  rep stos    dword ptr es:[edi]  
    72:     printf("%d",x);
004114DE  mov         esi,esp  
004114E0  mov         eax,dword ptr [ebp+8]  
004114E3  push        eax  
004114E4  push        416858h  
    72:     printf("%d",x);
004114E9  call        dword ptr ds:[0041A2BCh]  
004114EF  add         esp,8  
004114F2  cmp         esi,esp  
004114F4  call        00411181  
    73:     return x + y;
004114F9  mov         eax,dword ptr [ebp+8]  
004114FC  add         eax,dword ptr [ebp+0Ch]  
    74: }
004114FF  pop         edi  
00411500  pop         esi  
00411501  pop         ebx  
00411502  add         esp,0C0h  
00411508  cmp         ebp,esp  
0041150A  call        00411181  
0041150F  mov         esp,ebp  
00411511  pop         ebp  
00411512  **ret**  
  • __stdcall
 293:   int r2 = Plus2(1,4);  // 内平栈。 winapi--基本都是stdcall
004119E7  push        4  
004119E9  push        1  
004119EB  call        0041111D  
----------
    76: int  __stdcall Plus2(int x, int y)
    77: {
00411530  push        ebp  
00411531  mov         ebp,esp  
00411533  sub         esp,0C0h  
00411539  push        ebx  
0041153A  push        esi  
0041153B  push        edi  
0041153C  lea         edi,[ebp+FFFFFF40h]  
00411542  mov         ecx,30h  
00411547  mov         eax,0CCCCCCCCh  
0041154C  rep stos    dword ptr es:[edi]  
    78:     return x + y;
0041154E  mov         eax,dword ptr [ebp+8]  
00411551  add         eax,dword ptr [ebp+0Ch]  
    79: }
00411554  pop         edi  
00411555  pop         esi  
00411556  pop         ebx  
00411557  mov         esp,ebp  
00411559  pop         ebp  
0041155A  **ret         8** 
  • fastcall–2个参数
004119F3  mov         edx,4  
004119F8  mov         ecx,1  
004119FD  call        0041102D  
----------
    81: int __fastcall Plus3(int x, int y)
    82: {
00411570  push        ebp  
00411571  mov         ebp,esp  
00411573  sub         esp,0D8h  
00411579  push        ebx  
0041157A  push        esi  
0041157B  push        edi  
0041157C  push        ecx  
0041157D  lea         edi,[ebp+FFFFFF28h]  
00411583  mov         ecx,36h  
00411588  mov         eax,0CCCCCCCCh  
0041158D  rep stos    dword ptr es:[edi]  
0041158F  pop         ecx  
00411590  mov         dword ptr [ebp-14h],edx  
00411593  mov         dword ptr [ebp-8],ecx  
    83:     return x + y;
00411596  mov         eax,dword ptr [ebp-8]  
    83:     return x + y;
00411599  add         eax,dword ptr [ebp-14h]  
    84: }
0041159C  pop         edi  
0041159D  pop         esi  
0041159E  pop         ebx  
0041159F  mov         esp,ebp  
004115A1  pop         ebp  
004115A2  **ret** 
  • fastcall–4个参数
   297:     int r4 =Plus4(1,4,5,6);
00411A05  push        6  
00411A07  push        5  
00411A09  mov         edx,4  
00411A0E  mov         ecx,1  
00411A13  call        004110FF  
00411A18  mov         dword ptr [ebp-30h],eax  
----------
    86: int __fastcall Plus4(int x, int y,int z,int k)
    87: {
004115B0  push        ebp  
004115B1  mov         ebp,esp  
004115B3  sub         esp,0D8h  
004115B9  push        ebx  
004115BA  push        esi  
004115BB  push        edi  
004115BC  push        ecx  
004115BD  lea         edi,[ebp+FFFFFF28h]  
004115C3  mov         ecx,36h  
004115C8  mov         eax,0CCCCCCCCh  
004115CD  rep stos    dword ptr es:[edi]  
004115CF  pop         ecx  
004115D0  mov         dword ptr [ebp-14h],edx  
004115D3  mov         dword ptr [ebp-8],ecx  
    88:     printf("%d",x);
004115D6  mov         esi,esp  
    88:     printf("%d",x);
004115D8  mov         eax,dword ptr [ebp-8]  
004115DB  push        eax  
004115DC  push        416858h  
004115E1  call        dword ptr ds:[0041A2BCh]  
004115E7  add         esp,8  
004115EA  cmp         esi,esp  
004115EC  call        00411181  
    89:     return x + y+z+k;
004115F1  mov         eax,dword ptr [ebp-8]  
004115F4  add         eax,dword ptr [ebp-14h]  
004115F7  add         eax,dword ptr [ebp+8]  
004115FA  add         eax,dword ptr [ebp+0Ch]  
    90: }
004115FD  pop         edi  
004115FE  pop         esi  
004115FF  pop         ebx  
00411600  add         esp,0D8h  
00411606  cmp         ebp,esp  
00411608  call        00411181  
0041160D  mov         esp,ebp  
0041160F  pop         ebp  
00411610  ret         8  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值