首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

x64 組合語言呼叫慣例:Windows x64 單一慣例與 ML64 參數傳遞

     編輯:程式設計綜合問答

x64 Windows **棄用 __stdcall、__cdecl 等多種慣例**,統一使用 **Microsoft x64 呼叫慣例**:

  • 前 4 個整數/指標參數依序放入 RCX, RDX, R8, R9。
  • 浮點參數放入 XMM0~XMM3。
  • 額外參數壓入堆疊 (右至左),呼叫者清理堆疊 (影子空間 32 字節)。
  • 返回值:整數/指標 RAX,浮點 XMM0。
  • 非易失性暫存器 RBX, RBP, RDI, RSI, R12~R15 被呼叫者保存。

ML64 組合語言撰寫要點

; Int_3.asm
PUBLIC Int_3
.CODE
Int_3 PROC
    ; RCX = a, RDX = b, R8 = c, R9 = d (前四個參數)
    ; 若需第 5 參數,從 [RSP+40h] 取得 (影子空間 32 bytes + 返回地址 8 bytes)
    mov eax, 12345h
    ret
Int_3 ENDP
END
  • **不要**在組合語言中手動壓堆疊模擬 __stdcall,直接使用暫存器參數。
  • ML64 **不支援傳統 PROC a:DWORD, b:DWORD 語法**,需手動對應暫存器。
  • 若需相容舊慣例,請在 C++ 端用 extern "C" 並編寫封裝函式轉換參數。

C++ 宣告對應

extern "C" void Int_3(unsigned long a, long b, long c, long d); // 4 參數
// 呼叫端自動依 x64 慣例放入 RCX, RDX, R8, R9

參考資源

掌握 x64 單一呼叫慣例,組合語言直接操作暫存器即可,無需堆疊模擬。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved