暫存器使用方式
x64 架構提供 16 個一般用途的暫存器 (以下稱為整數暫存器) 以及 16 個做為浮點用途的 XMM 暫存器。 動態暫存器是可隨意讀寫的暫存器,呼叫端假設在呼叫之間其內容會遭到修改。 靜態暫存器需要在函式呼叫之間保留其值,而且如果會使用到,則必須由被呼叫端儲存。
下表說明每個暫存器在函式呼叫之間的使用方式:
註冊 |
狀態 |
使用 |
RAX |
動態 |
傳回值的暫存器 |
RCX |
動態 |
第一個整數引數 |
RDX |
動態 |
第二個整數引數 |
R8 |
動態 |
第三個整數引數 |
R9 |
動態 |
第四個整數引數 |
R10:R11 |
動態 |
必須由呼叫端視需要保留;在 syscall/sysret 指令中使用 |
R12:R15 |
靜態 |
必須由被呼叫端保留 |
RDI |
靜態 |
必須由被呼叫端保留 |
RSI |
靜態 |
必須由被呼叫端保留 |
RBX |
靜態 |
必須由被呼叫端保留 |
RBP |
靜態 |
可用來做為框架指標;必須由被呼叫端保留。 |
RSP |
靜態 |
堆疊指標 |
XMM0 |
動態 |
第一個 FP 引數 |
XMM1 |
動態 |
第二個 FP 引數 |
XMM2 |
動態 |
第三個 FP 引數 |
XMM3 |
動態 |
第四個 FP 引數 |
XMM4:XMM5 |
動態 |
必須由呼叫端視需要保留 |
XMM6:XMM15 |
靜態 |
必須由被呼叫端視需要保留。 |