x64 暫存器速查表
本文匯總 x64 架構下最核心的暫存器狀態與 ABI 約定。
暫存器
x64 暫存器完美向下相容。寫入低 32 位 (如 MOV EAX, 1) 會自動清零高 32 位;但寫入 8/16 位則保留高位數據。
通用暫存器 (GPRs) 速查表
| 64-bit | 32-bit | 16-bit | 8-bit | 用途 (System V / 通用) | 易失性 |
|---|---|---|---|---|---|
| RAX | EAX | AX | AL | 返回值 / 累加器 | Caller Saved |
| RBX | EBX | BX | BL | 基址 / 通用數據 | Callee Saved |
| RCX | ECX | CX | CL | 循環計數 / 第4參數 | Caller Saved |
| RDX | EDX | DX | DL | I/O / 乘除法 / 第3參數 | Caller Saved |
| RSI | ESI | SI | SIL | 源地址 / 第2參數 | Caller Saved |
| RDI | EDI | DI | DIL | 目的地址 / 第1參數 | Caller Saved |
| RBP | EBP | BP | BPL | 棧底指針 (Base Ptr) | Callee Saved |
| RSP | ESP | SP | SPL | 棧頂指針 (Stack Ptr) | Callee Saved |
| R8 | R8D | R8W | R8B | 第5參數 | Caller Saved |
| R9 | R9D | R9W | R9B | 第6參數 | Caller Saved |
| R10 | R10D | R10W | R10B | 臨時暫存器 (Static Chain) | Caller Saved |
| R11 | R11D | R11W | R11B | 臨時 / 連結暫存器 | Caller Saved |
| R12-R15 | RxxD | RxxW | RxxB | 通用數據儲存 | Callee Saved |
關鍵術語:
- Caller Saved: 調用函數前,如果還需要這些值,調用者必須自己壓棧保存。函數返回後值可能變了。
- Callee Saved: 被調用的函數必須保證在返回時,這些暫存器的值和調用前一樣(通常通過
push/pop維護)。
函數調用約定
A. System V AMD64 ABI (Linux, macOS)
- 傳參順序 (前6個):
RDIRSIRDXRCXR8R9 - 超過6個: 壓入棧 (Stack)。
- 返回值:
RAX(若結果為 128 位,高位在RDX)。 - System Call: 使用
syscall指令,參數傳給RAX(系統調用號),RDI,RSI,RDX,R10,R8,R9。
B. Microsoft x64 (Windows)
- 傳參順序 (前4個):
RCXRDXR8R9 - 超過4個: 壓入棧。
- Shadow Space: 調用者必須在棧上預留 32位元組 (4個暫存器寬) 的空間,即使參數很少。
- 返回值:
RAX。
關鍵狀態標誌
控制流指令 (JMP, Jcc) 的依據。
- ZF (Zero Flag): 運算結果為 0 時置位。
- SF (Sign Flag): 結果為負(最高位為1)時置位。
- OF (Overflow Flag): 有符號運算溢出時置位。
- CF (Carry Flag): 無符號運算進位/借位時置位。
浮點與 SIMD (AVX/SSE)
- XMM0 - XMM15: 128位 (Legacy SSE)。
- YMM0 - YMM15: 256位 (AVX,低 128 位映射到 XMM)。
- ZMM0 - ZMM31: 512位 (AVX-512,低 256 位映射到 YMM)。
- 參數傳遞 (System V ABI):
- 浮點參數: 前 8 個浮點參數通過
XMM0到XMM7傳遞。 - 浮點返回: 通過
XMM0返回。 - 易失性:
XMM0-XMM15通常都是 Caller-saved (易失的)。
- 浮點參數: 前 8 個浮點參數通過