函式呼叫方式

2021-06-03 19:57:10 字數 2251 閱讀 5694

現代的程式語言的函式竟然有那麼多的呼叫方式。這些東西要完全理解還得通過彙編**才好理解。他們各自有自己的特點

其實這些呼叫方式的差別在主要在一下幾個方面

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...