呼叫慣例 calling convention

這篇與之前的文章有點類似,當作再複習一次吧!


C 語言的呼叫慣例 calling convention 大致上規範了如下的東西:


1. 參數傳遞方式。看是由右至左或左至右,或者透過 register
2. 堆疊維護。看是由函式本身或由呼叫者來維護堆疊 (在呼叫返回時回復堆疊)
3. 名稱修飾 (name mangling)


在 MSVC 中,一般有 _cdecl/_stdcall/_fastcall 等三種呼叫慣例,它們的內容為:


1. _cdecl:參數由右至左傳遞,函式呼叫者維護堆疊
2. _stdcall:參數由右至左傳遞,函式本身維護堆疊
3. _fastcall:第一及第二個小於 4 bytes 的參數放入 register,其餘參數由右至左傳遞,函式本身維護堆疊


使用堆疊時是用 ebp/esp 兩個指標。所謂的回復堆疊事實上就是將 esp 設回一開始的值,因為 esp 代表堆疊使用的指標。比如說一個函式有兩個 4 bytes 區域變數。則 esp + 8 就代表將這 8 bytes 收回。(堆疊是由高位址往低位址生長)


在宣告及實作時的函式呼叫慣例一定要相同,否則就會出錯


留言

熱門文章