呼叫者--呼叫函式的一方
被呼叫者--被呼叫的函式
原有三種方式:
__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關鍵字說明 按從右至左的順序壓引數入棧,由呼叫者把引數彈...