函式呼叫約定

2022-09-12 08:18:14 字數 987 閱讀 4257

呼叫者--呼叫函式的一方

被呼叫者--被呼叫的函式

原有三種方式:

__cdecl,呼叫者負責清理棧空間

__stdcall,被呼叫者負責清理棧空間

__fastcall,前兩個引數必須由暫存器ecx, edx進行傳遞。

x86(x32)預設使用的cdecl方式進行函式呼叫

x64 廢棄了x86(x32)既有的呼叫約定,預設情況下使用fastcall的呼叫約定。

x64:

fastcall,整型傳參時,前四個引數將被儲存在rcx, rdx, r8, r9中,後面的引數將存放於堆疊上

void func(int a, int b, int c, int d) ->rcx, rdx, r8, r9

fastcall,浮點數傳參時,前四個引數將被儲存在xmm0, xmm1, xmm2, xmm3中,後面的引數將存放於堆疊上

void func(float a, float b, float c, float d)->xmm0, xmm1. xmm2, xmm3

引數型別

第 5 個和更高位置

第 4 個

第3 個

第 2 個

最左側浮點

堆疊xmm3

xmm2

xmm1

xmm0

整數堆疊

r9r8

rdxrcx

聚合(8、16、32 或 64 位)和__m64

堆疊r9

r8rdx

rcx其他聚合,作為指標

堆疊r9

r8rdx

rcx__m128,作為指標

堆疊r9

r8rdx

rcx後話:

x64使用的__fastcall的原因可能有以下原因:

1.暫存器數量整型和浮點型各有16個,在數量上滿足了傳參的需要。

2.cpu訪問暫存器的速度明顯快於訪問記憶體。

函式呼叫約定

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