X64呼叫規範

2022-08-28 00:39:09 字數 673 閱讀 7211

1.由於位址長度為64位,因此call指令把rsp(堆疊指標)暫存器的值減去8.

2.第一批傳遞子程式的四個引數依次存放於暫存器rcx、rdx、r8、r9。因此,如果只傳遞乙個引數就會放到rcx暫存器中。如果還有第二引數就會將其放入rdx暫存器中,其他引數從右至左入棧。

3.長度不足64位的引數不進行零擴充套件,因此,其高位的值是不確定的。

4.如果返回值的長度小於或者等於64位,那麼它必須放在rax暫存器中。

5.主調者負責在堆疊中分配至少32位元組的影子空間,以便被呼叫的子程式可以選擇將暫存器的值儲存在這個區域。

6.呼叫子程式時,堆疊指標(rsp)必須對齊16位元組邊界。call指令將8位元組的返回位址壓入堆疊,因此,主調程式除了把堆疊指標減去32以便存放暫存器引數外,還要減去8(本人注:所以寫64位彙編的時候老是開棧28h,48h的).

7.被呼叫子程式執行結束後,主調程式需負責從執行時堆疊中移除所有的引數及影子空間(編譯器為rc、rdx、r8、r9預留的空間)。

8.大於64位的返回值存放於執行時堆疊,由rcx指出其位置。

9.暫存器rax、rcx、rdx、r8、r9、r10和r11常常被子程式修改,因此,如果主調程式想要儲存他們的值,就應在呼叫子程式之前將它們入棧,之後再將其從堆疊中彈出。

10.暫存器rbx、rbp、rdi、rsi、r12、r13、r14和r15的值必須由子程式儲存。

windows程式設計 x64呼叫約定

windows32位程式包括stdcall,thiscall,fastcall,cdecl,clrcall,vectorcall,nakedcall等呼叫方式,x64位程式預設使用新的fastcall呼叫方式。這種呼叫方式得益於x64平台暫存器數量的增加。空間大於8位元組的引數用參照傳遞,不能把乙個...

x64內聯彙編

建立 asm,寫入測試彙編 code asmadd proc mov rax,rcx add rax,rdx retasmadd endp end整形引數順序 rcx,rdx,r8,r9,rsp 浮點引數順序 xmm1,xmm2,xmm3.混合引數順序 第乙個引數整形 rcx,第二個引數浮點 xmm...

關於x64彙編呼叫api的問題

以radasm為例子 win32彙編呼叫api比較簡單 invoke api名字,引數 64位的就不會了 用ida看了一下生成的彙編 下面是個例子 call cs getcurrentprocess mov r9d,0ch nsize mov r8,rdi lpbuffer mov rdx,rsi ...