呼叫慣例定義函數參數傳遞、堆疊清理、返回值放置、名稱修飾等規則,是跨模組/語言互操作的關鍵契約。
EAX (32位) / EDX:EAX (64位)EDI, ESI, EBP, EBX (Callee-saved)| 慣例 | 堆疊清理 | 壓棧順序 | this 傳遞 | 可變參數 | 名稱修飾 | 典型用途 |
|---|---|---|---|---|---|---|
| __cdecl | Caller | 右→左 | N/A | ✅ 支援 | _func | C/C++ 預設、printf 類 |
| __stdcall | Callee | 右→左 | N/A | ❌ 不支援 | _func@N | Win32 API、COM、.NET P/Invoke 預設 |
| __fastcall | Callee | 右→左 | N/A | ❌ 不支援 | @func@N | 前兩個整數參數用 ECX/EDX |
| __thiscall | Callee | 右→左 | ECX | ❌ 不支援 | 編譯器相關 | C++ 非靜態成員函數 |
int __stdcall Test(int a, char b, short c) { return a+c; }
main() { Test(5, 'a', 10); }
main 呼叫端: push 0Ah ; 參數 3 (10) push 61h ; 參數 2 ('a') push 5 ; 參數 1 (5) call Test mov [ebp-4], eax ; 取得返回值,無額外堆疊清理指令 Test 內部結尾: ret 0Ch ; Callee 清理 12 bytes (3 參數 × 4 bytes)
int __stdcall Func(int);/Gd (__cdecl), /Gr (__fastcall), /Gz (__stdcall, C++ 預設)[DllImport(..., CallingConvention=CallingConvention.StdCall)]WINAPI 實為 __stdcall)x64 (AMD64/IA64) 僅有一種呼叫慣例:前 4 個整數參數用 RCX, RDX, R8, R9,浮點用 XMM0-3,其餘入堆,Caller 清理,無慣例衝突問題。