現代的程式語言的函式竟然有那麼多的呼叫方式。這些東西要完全理解還得通過彙編**才好理解。他們各自有自己的特點
其實這些呼叫方式的差別在主要在一下幾個方面
1.引數處理方式(傳遞順序,訪問(利用盞還是暫存器))
2.函式的結尾處理方式(善後處理 如:棧的恢復由誰恢復? 函式內恢復/還是呼叫後恢復)
以下是理論:
__cdecl 由呼叫者平棧,引數從右到左依次入棧 是c和c++程式的預設呼叫方式。每乙個呼叫它的函式都包含清空堆疊的**,以下是實踐:所以產生的可執行檔案大小會比呼叫_stdcall函式的大。函式採用從右到左的壓棧方式。vc將函式編譯後會在函式名前面加上
下劃線字首。是mfc預設呼叫約定
__stdcall ,winapi,callback ,pascal 由被呼叫者平棧,引數從右到左依次入棧 ._stdcall是pascal程式的預設呼叫方式,
通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃
線字首,在函式名後加上"@"和引數的位元組數
__fastcall 由被呼叫者平棧,引數先賦值給暫存器,然後入棧 「人」如其名,它的主要特點就是快,因為它是通過暫存器來傳送引數的
(實際上,它用ecx和edx傳送前兩個雙字(dword)或更小的引數,剩下的引數仍舊自右向左壓棧傳送,被呼叫的函式在返回前
清理傳送引數的記憶體棧),在函式名修飾約定方面,它和前兩者均不同.
_fastcall方式的函式採用暫存器傳遞引數,vc將函式編譯後會在函式名前面加上"@"字首,在函式名後加上"@"和引數的位元組數。
__thiscall 由被呼叫者平棧,引數入棧,this 指標賦給 ecx 暫存器 僅僅應用於「c++」成員函式。this指標存放於cx暫存器,引數從右
__declspec(naked) 這是乙個很少見的呼叫約定,一般程式設計者建議不要使用。編譯器不會給這種函式增加初始化和清理**,
更特殊的是,你不能用return返回返回值,只能用插入彙編返回結果。這一般用於實模式驅動程式設計.
int __stdcall test_stdcall(
char para1,
char para2)
int __cdecl test_cdecl(
char para,
va_end( marker );
return 0; }
int pascal test_pascal(
char para1,
char para2)
int __fastcall test_fastcall(
char para1,
char para2,
char para3,
char para4)
__declspec(naked)
void __stdcall test_naked(
char para1,
char para2)
//return ;}
int main(
int argc,
char* argv)
彙編**如下
int main(
int argc,
char* argv)
int __stdcall test_stdcall(char para1, char para2)
int __cdecl test_cdecl(char para,... )
va_end( marker );
00411290 mov dword ptr [marker],0
return 0;
00411297 xor eax,eax
004112a9 mov esp,ebp
004112ab pop ebp
004112ac ret }
int __fastcall test_fastcall(char para1, char para2, char para3, char para4)
__declspec(naked) void __stdcall test_naked(char para1, char para2)
函式呼叫方式
cdecl 是c declaration的縮寫,表示c語言預設的函式呼叫方法 所有引數從右到左依次入棧,這些引數由呼叫者清除,稱為手動清棧。被呼叫函式不需要求呼叫者傳遞多少引數,呼叫者傳遞過多或者過少的引數,甚至完全不同的引數都不會產生編譯階段的錯誤。stdcall 是standard call的縮...
函式呼叫方式
所謂的呼叫方式是指 在呼叫乙個函式時,約定的傳遞引數方式和平衡堆疊方式,例如 有乙個函式,它有兩個引數 xyz first,second 當我們使用stdcall呼叫方式時,也就是windows呼叫api的常見方式 又幾個函式例外 它的呼叫方式如下 x1 push second x2 push fi...
函式呼叫方式
在高階語言中,就是通過函式的呼叫方式來說明這兩個問題的。常見的呼叫方式有 stdcall cdecl fastcall thiscall thiscall naked call 下面就分別介紹這幾種呼叫方式 1.stdcall stdcall呼叫方式又被稱為pascal呼叫方式。在microsoft...