x64 架構

x64 架構是 x86 的回溯相容延伸模組。 它提供新的 64 位模式和舊版 32 位模式,與 x86 相同。

「x64」 一詞同時包含 AMD 64 和 Intel64。 指令集幾乎完全相同。

暫存器

x64 會將 x86 的 8 個一般用途暫存器擴充為 64 位,並新增 8 個新的 64 位暫存器。 64 位暫存器的名稱開頭為 「r」。 例如, eax 的 64 位延伸稱為 rax。 新的暫存器名稱為 r8r15

每個暫存器較低的 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 行為) 。

axbxcxdx的高 8 位仍可定址為ahbhchdh,但無法搭配所有類型的運算元使用。

指令指標 eipflags 暫存器已分別擴充至 64 位,) (擷取rflags

x64 處理器也提供陣列浮點暫存器:

  • 八個 80 位 x87 暫存器。

  • 八個 64 位 MMX 暫存器。 (這些暫存器與 x87 registers.) 重迭

  • 128 位 SSE 暫存器的原創組合會增加到十六個。

呼叫慣例

不同于 x86,C/C++ 編譯器只支援 x64 上的一個呼叫慣例。 此呼叫慣例會利用 x64 上可用的暫存器數目增加:

  • 前四個整數或指標參數會在 rcxrdxr8r9 暫存器中傳遞。

  • 前四個浮點參數會傳入前四個 SSE 暫存器xmm0-xmm3

  • 呼叫端會針對傳入暫存器中的引數,保留堆疊上的空間。 呼叫的函式可以使用這個空間,將暫存器的內容溢出至堆疊。

  • 堆疊上會傳遞任何其他引數。

  • 在 rax暫存器中會傳回整數或指標傳回值,而浮點傳回值則會在xmm0中傳回。

  • raxrcxrdxr8-r11是 volatile。

  • rbxrbprdirsir12-r15為非volatile。

C++ 的呼叫慣例很類似。 這個指標會傳遞為隱含的第一個參數。 接下來的三個參數會傳入其餘暫存器,而其餘參數則會在堆疊上傳遞。

定址模式

64 位模式中的定址模式類似,但與 x86 不同。

  • 參考 64 位暫存器指示的指示會自動以 64 位有效位數執行。 例如, mov rax,[rbx] 會將 8 個位元組從 rbx 開始移至 rax

  • 已針對 64 位即時常數或常數位址新增一種特殊形式的 mov 指令。 對於所有其他指示,即時常數或常數位址仍是 32 位。

  • x64 提供新的 擷取相對定址模式。 參考單一常數位址的指示會編碼為 來自擷取的位移。 例如,mov rax, [addr]指令會從載入器 + 擷取開始移動 8 個位元組到rax

指示,例如 jmpcallpushpop,隱含參考指令指標,而堆疊指標會將它們視為 x64 上的 64 位暫存器。

另請參閱