x64 架構
x64 架構是 x86 的回溯相容延伸模組。 它提供新的 64 位模式和舊版 32 位模式,與 x86 相同。
「x64」 一詞同時包含 AMD 64 和 Intel64。 指令集幾乎完全相同。
暫存器
x64 會將 x86 的 8 個一般用途暫存器擴充為 64 位,並新增 8 個新的 64 位暫存器。 64 位暫存器的名稱開頭為 「r」。 例如, eax 的 64 位延伸稱為 rax。 新的暫存器名稱為 r8 到 r15。
每個暫存器較低的 32 位、16 位和 8 個位都可以在運算元中直接定址。 這包括 esi之類的暫存器,其較低 8 位先前無法定址。 下表指定 64 位暫存器下半部的元件語言名稱。
64 位暫存器 | 較低的 32 位 | 較低的 16 位 | 較低的 8 位 |
---|---|---|---|
rax | eax | ax | al |
rbx | ebx | bx | bl |
rcx | ecx | 殘雪 | cl |
rdx | edx | Dx | Dl |
rsi | Esi | si | sil |
rdi | Edi | di | dil |
rbp | Ebp | bp | bpl |
粒子 | Esp | sp | Spl |
r8 | r8d | r8w | r8b |
r9 | r9d | r9w | r9b |
r10 | r10d | r10w | r10b |
r11 | r11d | r11w | r11b |
r12 | r12d | r12w | r12b |
r13 | r13d | r13w | r13b |
r14 | r14d | r14w | r14b |
r15 | r15d | r15w | r15b |
輸出至 32 位子登錄的作業會自動以零擴充至整個 64 位暫存器。 輸出至 8 位或 16 位子登錄的作業不會以零為延伸, (這是相容的 x86 行為) 。
ax、bx、cx和dx的高 8 位仍可定址為ah、bh、ch、dh,但無法搭配所有類型的運算元使用。
指令指標 eip 和 flags 暫存器已分別擴充至 64 位,) (擷取 和 rflags。
x64 處理器也提供陣列浮點暫存器:
八個 80 位 x87 暫存器。
八個 64 位 MMX 暫存器。 (這些暫存器與 x87 registers.) 重迭
128 位 SSE 暫存器的原創組合會增加到十六個。
呼叫慣例
不同于 x86,C/C++ 編譯器只支援 x64 上的一個呼叫慣例。 此呼叫慣例會利用 x64 上可用的暫存器數目增加:
前四個整數或指標參數會在 rcx、 rdx、 r8和 r9 暫存器中傳遞。
前四個浮點參數會傳入前四個 SSE 暫存器xmm0-xmm3。
呼叫端會針對傳入暫存器中的引數,保留堆疊上的空間。 呼叫的函式可以使用這個空間,將暫存器的內容溢出至堆疊。
堆疊上會傳遞任何其他引數。
在 rax暫存器中會傳回整數或指標傳回值,而浮點傳回值則會在xmm0中傳回。
rax、rcx、rdx、r8-r11是 volatile。
rbx、rbp、rdi、rsi、r12-r15為非volatile。
C++ 的呼叫慣例很類似。 這個指標會傳遞為隱含的第一個參數。 接下來的三個參數會傳入其餘暫存器,而其餘參數則會在堆疊上傳遞。
定址模式
64 位模式中的定址模式類似,但與 x86 不同。
參考 64 位暫存器指示的指示會自動以 64 位有效位數執行。 例如, mov rax,[rbx] 會將 8 個位元組從 rbx 開始移至 rax。
已針對 64 位即時常數或常數位址新增一種特殊形式的 mov 指令。 對於所有其他指示,即時常數或常數位址仍是 32 位。
x64 提供新的 擷取相對定址模式。 參考單一常數位址的指示會編碼為 來自擷取的位移。 例如,mov rax, [addr]指令會從載入器 + 擷取開始移動 8 個位元組到rax。
指示,例如 jmp、 call、 push和 pop,隱含參考指令指標,而堆疊指標會將它們視為 x64 上的 64 位暫存器。