C 函式的呼叫約定

2021-10-25 08:22:45 字數 1628 閱讀 3094

呼叫約定允許你指定被調函式和呼叫者之間傳遞引數和返回值的方式。不同的呼叫約定區別主要在於:

並非所有約定都在所有支援的平台上可用,某些約定使用平台特定的實現。這篇文章描述的是windows x86平台。

在 x86 平台上,所有引數在傳遞時都將加寬到 32 位。 返回值也將加寬到 32 位,並通過 eax 暫存器返回。8位元組的結構是乙個例外,它通過edx:eax暫存器對返回。更大的結構將在 eax 暫存器中作為指向被隱藏的返回結構的指標返回。

如圖所示(使用vs 2019的除錯功能,並非實際的彙編**):

關鍵字堆疊清理

引數傳遞

__cdecl

呼叫方在堆疊上按相反順序推送引數(從右到左)

__stdcall

被呼叫方

在堆疊上按相反順序推送引數(從右到左)

__fastcall

被呼叫方

儲存在暫存器中,然後在堆疊上推送

__cdecl是c和c++程式的預設呼叫約定。由呼叫方負責清理堆疊。__cdecl呼叫約定建立的可執行檔案比__stdcall更大,因為它要求每個函式呼叫包含堆疊清理**。

__stdcall呼叫約定用於呼叫 win32 api 函式。 被呼叫方清理堆疊。

__fastcall呼叫約定指定函式的引數在暫存器中傳遞(如果可能)。在引數列表中前兩個被找到的dword或更小的引數將從左到右傳遞給ecx和edx暫存器;所有其他的引數在棧上從右到左傳遞。

C 函式呼叫約定

stdcall是 函式呼叫約定的一種,函式呼叫約定主要約束了兩件事 1.引數傳遞順序 2.呼叫 堆疊由誰 呼叫函式或 被呼叫函式 清理 常見的 函式呼叫約定 stdcall cdecl fastcall thiscall naked call stdcall表示 1.引數從右向左壓入堆疊 2.函式被...

c 函式呼叫約定

函式的呼叫約定,當乙個函式被呼叫時,引數的傳遞以及返回值以什麼樣的方式回到呼叫函式 函式的呼叫約定就是指引數和返回值是怎麼樣傳遞的,以及是由誰平衡堆疊的。函式的呼叫約定主要針對三個問題 1.函式符號的生成與編譯後的名稱 2.實參的入棧順序 3.形參的開闢與清理方式 一 cdecl呼叫約定 cdecl...

C 函式的呼叫約定

一 c c 函式的呼叫約定 預設使用 cdecl 1 cdecl c標準呼叫約定 2 stdcall windows標準呼叫約定 3 fastcall 快速呼叫約定 4 thiscall 類成員方法的呼叫約定 約定了 1 符號生成規則 列如 int sum int,int 1 sum yahhh z...