函式呼叫約定

2021-07-27 13:35:42 字數 1222 閱讀 5525

函式呼叫約定 

常見的函式呼叫約定[5]:cdecl,stdcall,fastcall,thiscall,naked call

mfc呼叫約定(vs6:project settings->c/c++ calling convention:) 

1, __cdecl(c呼叫約定.the c default calling convention)c/c++ 預設呼叫方式 

1)壓棧順序:函式引數從右到左 

2)引數棧維護:由呼叫函式把引數彈出棧,傳送引數的記憶體棧由呼叫函式來維護 

(正因為如此,實現可變引數vararg的函式(如printf)只能使用該呼叫約定) 

3)函式修飾名約定:vc將函式編譯後會在函式名前面加上下劃線字首 

4)每乙個呼叫它的函式都包含清空堆疊的**,所以產生的可執行檔案大小會比呼叫_stdcall函式的大 

2, __stdcall (pascal方式清理c方式壓棧,通常用於win32 api中) 

1)壓棧順序:函式引數從右到左的壓棧順序 

2)引數棧維護:被呼叫函式把引數彈出棧(在退出時清空堆疊)

3)函式修飾名約定:vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上"@"和引數的位元組數

ex. vc: int f(void *p) (編譯後)-> 

_f@4

(在外部組合語言裡可以用這個名字引用這個函式) 

3, __fastcall (快速呼叫約定,通過暫存器來傳送引數) 

1)壓棧順序:用ecx和edx傳送前兩個雙字(dword)或更小的引數,剩下的引數仍舊自右向左壓棧傳送 

2)引數棧維護:被呼叫函式在返回前清理傳送引數的記憶體棧 

3)函式修飾名約定:vc將函式編譯後會在函式名前面加上"@"字首,在函式名後加上"@"和引數的位元組數 

4, thiscall (本身呼叫,僅用於「c++」成員函式) 

1)壓棧順序:this指標存放於cx/ecx暫存器中,引數從右到左的壓棧順序 

5, naked call (裸調) 

1)當採用1-4的呼叫約定時,如果必要的話,進入函式時編譯器會產生**來 

儲存esi,edi,ebx,ebp暫存器,退出函式時則產生**恢復這些暫存器的內容 

(這些**稱作 prolog and epilog code,一般,ebp,esp的儲存是必須的) 

2)naked call不產生這樣的**。naked call不是型別修飾符,故必須和_declspec共同使用 

函式呼叫約定

函式呼叫約定有多種,這裡簡單說一下 1 stdcall 呼叫約定相當於16位動態庫中經常使用的 pascal 呼叫約定。在32位的vc 5.0中pascal呼叫約定不再被支援 實際上它已被定義為 stdcall。除了 pascal外,fortran和 syscall也不被支援 取而代之的是 stdc...

函式呼叫約定

函式呼叫約定1.stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧,由呼...

函式呼叫約定

1.stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧,由呼叫者把引數彈...