x86平台下的調用約定
_cdecl __fastcall與 __stdcall,三者都是調用約定(Calling convention),它決定以下內容:
1)函數參數的壓棧順序
2)由調用者還是被調用者把參數彈出棧
3)以及產生函數修飾名的方法。
1、
__stdcall調用約定:
__stdcall是
Windows API默認調用約定,微軟的WINAPI、CALLBACK等宏都是這個調用約定
函數的參數自
右向左通過棧傳遞,
被調用的函數在返回前
清理傳送參數的內存棧,
2、
__cdecl:
__cdecl是
C/C++的默認調用約定,如果不顯示聲明調用約定的情況下,就是該調用約定。
函數的參數自
右向左通過棧傳遞,每一個
調用它的函數都包含
清理堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。
注意:對於可變參數的成員函數,始終使用__cdecl的轉換方式。
3、
__fastcall調用約定:它是通過
自右向左
寄存器傳參(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,
剩下的參數仍舊
自右向左壓棧傳送,
被調用的函數在返回前
清理傳送參數的內存棧)。
x64平台下的調用約定
x64平台取消了上文的_cdecl __fastcall __stdcall這些調用約定。而傳參是寄存器和棧相結合實現。
優先寄存器傳參. 前4個參數分別是 rcx rdx r8 r9進行傳參.多余的通過棧傳參.從右向左入棧.
函數傳參順序
32位函數入棧傳參
從右到左依次入棧
64位函數寄存器傳參
前四個參數從左到右依次入寄存器:rdx, rcx, r8, r9, 后面的依次從 右向左 入棧(和32位匯編一樣)