x86函式調用約定
cdecl
- C/C+=語言使用cdecl。
stdcall 與 cdecl 其實都很重要,像 Linux系統下就通通全部都是 cdecl,這種特性本身也體現了 Linux追求作為一個 "很純 C" 極致的作業系統,假如用 Linux 的話,基本上不太用煩惱呼叫慣例的問題。
假如有一條函式 int __cdecl MyAdd(int, int) 則
- 真名為 _MyAdd,沒錯,就是原來名稱前面加底線。
- __cdecl 這個 keyword 可以省略,因為一般 C語言環境通通預設都是這種呼叫慣例,除非修改環境設定。
stdcall
stdcall是由微軟創建的調用約定,是Windows API的標準調用約定。非微軟的編譯器並不總是支持該調用協議。
它的堆疊平衡是由 callee (被呼叫者) 自己負責,而不是 caller (呼叫者),參數推入堆疊的次序是由右至左,很顯而易見的是 stdcall 會產生體積較小的程式碼,因為你的主程式不用自己平衡堆疊