__stdcall, __cdecl, _cdecl, _stdcall, __fastcall, _fastcall

#define CALLBACK   __stdcall
#define WINAPI       __stdcall
#define WINAPIV     __cdecl
#define APIENTRY     WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL        __stdcall
#define cdecl             _cdecl
#define CDECL          _cdecl

__cdecl,__stdcall是聲明的函數調用協議.主要是傳參和彈棧方面的不同.一般c++用的是__cdecl,windows裏大都用的是__stdcall(API)

__cdecl是C/C++和MFC程序默認使用的調用約定,也可以在函數聲明時加上__cdecl關鍵字來手工指定。採用__cdecl約定時,函數參數按照從右到左的順序入棧,並且由調用函數者把參數彈出棧以清理堆棧。因此,實現可變參數的函數只能使用該調用約定。由於每一個使用__cdecl約定的函數都要包含清理堆棧的代碼,所以產生的可執行文件大小會比較大。__cdecl可以寫成_cdecl。
__stdcall調用約定用於調用Win32 API函數。採用__stdcall約定時,函數參數按照從右到左的順序入棧,被調用的函數在返回前清理傳送參數的棧,函數參數個數固定。由於函數體本身知道傳進來的參數個數,因此被調用的函數可以在返回前用一條ret n指令直接清理傳遞參數的堆棧。__stdcall可以寫成_stdcall。
__fastcall約定用於對性能要求非常高的場合。__fastcall約定將函數的從左邊開始的兩個大小不大於4個字節(DWORD)的參數分別放在ECX和EDX寄存器,其餘的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的堆棧。__fastcall可以寫成_fastcall

__stdcall調用約定:
1、以“?”標識函數名的開始,後跟函數名;
2、函數名後面以“@@YG”標識參數表的開始,後跟參數表;
3、參數表以代號表示:
X–void ,
D–char,
E–unsigned char,
F–short,
H–int,
I–unsigned int,
J–long,
K–unsigned long,
M–float,
N–double,
_N–bool,
….
PA–表示指針,後面的代號表明指針類型,如果相同類型的指針連續出現,以“0”代替,一個“0”代表一次重複;
4、參數表的第一項爲該函數的返回值類型,其後依次爲參數的數據類型,指針標識在其所指數據類型前;
5、參數表後以“@Z”標識整個名字的結束,如果該函數無參數,則以“Z”標識結束。

其格式爲“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如
int Test1(char *var1,unsigned long)—–“?Test1@@YGHPADK@Z”
void Test2() —–“?Test2@@YGXXZ”

__cdecl調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@YG”變爲“@@YA”。

__fastcall調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@YG”變爲“@@YI”。
VC++對函數的省缺聲明是“__cedcl“,將只能被C/C++調用.

Reference
1. __stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 區別簡介
2. __stdcall,__cdecl,__fastcall的區別
3. GPGPU-Sim安裝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章