與函式堆疊密切相關的就是函式呼叫約定,也就是就是函式的呼叫規範。
函式呼叫約定決定了函式呼叫的實參壓棧、退棧及堆疊釋放的方式,以及函式名改寫的方案(命名規範)。
常見的函式呼叫約定:cdecl,stdcall,fastcall,thiscall。
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暫存器中,引數從右到左的壓棧順序
函式呼叫約定
函式呼叫約定有多種,這裡簡單說一下 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關鍵字說明 按從右至左的順序壓引數入棧,由呼叫者把引數彈...