函式呼叫約定

2021-08-07 14:56:48 字數 794 閱讀 3505

cdecl

cdecl呼叫約定又稱為c呼叫約定,是c/c++語言預設的呼叫約定。引數按照從右至左的方式入棧,函式本身不清理棧,此工作有呼叫者負責,返回值在eax中。由於由呼叫者清理棧,所以允許可變引數函式存在。

stdcall

stdcall很多時候被稱為pascal呼叫約定。pascal語言是早期很常見的一種教學用計算機程式語言,其語法嚴謹,引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在eax中。

fastcall

fastcall的呼叫方式執行相對快,因為它通過暫存器來傳遞引數。它使用ecx和edx傳送兩個雙字或更小的引數,剩下的引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在eax中。

naked

naked是乙個很少見的呼叫約定,一般不建議使用。編譯器不會給這種函式增加初始化的清理**,更特殊的是,你不能用return返回返回值,只能用插入彙編返回結果,此呼叫約定必須跟declspec同時使用,例如宣告乙個函式,如_declspec(naked) int add(int a,int b);

pascal

這是pascal語言的呼叫約定,跟stdcall一樣,引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在 eax中,vc已經廢棄了這種呼叫方式,因此在寫vc程式時,建議使用stdcall。

thiscall

這是c++語言特有的一種呼叫方式,用於類成員函式的呼叫約定。如果引數確定,this指標存放於ecx暫存器,函式自身清理堆疊;如果引數不確定,this指標在所有引數入棧後再入棧,呼叫者清理棧。thiscall不是關鍵字,程式設計師不能使用。引數按照從右至左的方式r入棧。

函式呼叫約定

函式呼叫約定有多種,這裡簡單說一下 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關鍵字說明 按從右至左的順序壓引數入棧,由呼叫者把引數彈...