常见的几种调用约定
调用约定 参数压栈顺序 平衡堆栈
__cdecl 从右至左入栈 调用者清理栈
__stdcall 从右至左入栈 自身清理堆栈
__fastcall ECX/EDX传送前两个 自身清理堆栈
剩下:从右至左入栈
你希望很快,所以定义在2个参数内,参数超过2个,就不是很快了,也是用堆栈传参部分。
- _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