带着旧名字所有寄存器保持相同的大小,就像 x86-16 扩展到 x86-32 时一样。要访问 64 位整数寄存器,您可以使用新名称R-prefix例如拉克斯、RBX...
寄存器名称不会改变,因此您只需使用字节寄存器(al、bl、cl、dl、ah、bh、ch、dh) 的 LSB 和 MSB斧头、bx、cx、dx像以前一样。
还有8 个新寄存器 called r8-r15。您可以通过添加后缀来访问它们的 LSBb
(or l如果您使用的是 AMD)。例如r8b、r9b、r10l、r11l...您还可以使用 LSBESI、EDI、ESP、EBP按名字西尔、迪尔、spl、bpl与新的REX 前缀,但不能同时使用它ah、bh、ch 或 dh.
同样,新寄存器的最低字或双字可以通过后缀访问w
or d
.
Update:英特尔刚刚推出了x86-64 的新扩展 called APX添加了 16 个寄存器,名为 r16-r31
所以通用寄存器列表是这样的:
64-bit register |
Lower 32 bits |
Lower 16 bits |
Lower 8 bits |
rax |
eax |
ax |
al |
rbx |
ebx |
bx |
bl |
rcx |
ecx |
cx |
cl |
rdx |
edx |
dx |
dl |
rsi |
esi |
si |
sil |
rdi |
edi |
di |
dil |
rbp |
ebp |
bp |
bpl |
rsp |
esp |
sp |
spl |
r8 |
r8d |
r8w |
r8b (r8l) |
r9 |
r9d |
r9w |
r9b (r9l) |
r10 |
r10d |
r10w |
r10b (r10l) |
r11 |
r11d |
r11w |
r11b (r11l) |
r12 |
r12d |
r12w |
r12b (r12l) |
r13 |
r13d |
r13w |
r13b (r13l) |
r14 |
r14d |
r14w |
r14b (r14l) |
r15 |
r15d |
r15w |
r15b (r15l) |
r16 (with APX) |
r16d |
r16w |
r16b (r16l) |
r17 (with APX) |
r17d |
r17w |
r17b (r17l) |
... |
... |
... |
... |
r31 (with APX) |
r31d |
r31w |
r31b (r31l) |
当然还有其他类型的寄存器,例如control, debug, flag、浮点、向量、段、测试...寄存器。欲了解更多详情,请检查https://wiki.osdev.org/CPU_Registers_x86。也可以看看新的 X86_64 处理器寄存器的名称是什么?
Regarding the calling convention, on each specific system there's only one convention1.
-
在 Windows 上:
- RCX、RDX、R8、R9 表示前四个整数或指针参数
- XMM0、XMM1、XMM2、XMM3 用于浮点参数
1Since MSVC 2013 there's also a new extended convention on Windows called __vectorcall so the "single convention policy" is not true anymore.
-
在 Linux 和其他后续系统上系统 V AMD64 ABI,可以在寄存器上传递更多参数,并且有一个 128 字节red zone位于堆栈下方,这可能会使函数调用更快。
- 前六个整数或指针参数在寄存器 RDI、RSI、RDX、RCX、R8 和 R9 中传递
- 浮点参数在 XMM0 到 XMM7 中传递
欲了解更多信息,请阅读x86-64 and x86-64 调用约定
还有一个约定用于Plan 9 where
- 所有寄存器均由调用者保存
- 所有参数都在堆栈上传递
- 返回值也返回到堆栈上,位于参数下方(堆栈方式;amd64 上的较高地址)保留的空间中。
Golang 遵循 Plan 9 调用约定,但从 go 1.17+ 开始,他们逐渐引入了基于寄存器的调用约定为了更好的性能。调用约定将来可能会发生变化,编译器可以生成存根以自动调用旧约定中的汇编函数。眼下ABI 规定
- 9 个通用寄存器将用于传递整数参数:RAX、RBX、RCX、RDI、RSI、R8、R9、R10、R11
- 15 个寄存器 XMM0-XMM14 用于浮点参数
In fact Plan 9 was always a weirdo. For example it forces a register to be 0 on RISC architectures without a hardware zero register. x86 register names on it are also consistent across 16, 32 and 64-bit x86 architectures with operand size indicated by mnemonic suffix. That means ax can be a 16, 32 or 64-bit register depending on the instruction suffix. If you're curious about it read
- A Manual for the Plan 9 assembler
- Go/plan9’s assembler is weird
OTOH Itanium is a 完全不同的架构与 x86-64 没有任何关系。它是纯 64 位架构,因此所有普通寄存器都是 64 位,没有 32 位或更小的版本可用。里面有很多寄存器:
- 128 个通用整数寄存器 r0 到 r127,每个寄存器承载 64 个值位和一个陷阱位。稍后我们将了解有关陷阱的更多信息。
- 128 个浮点寄存器 f0 到 f127。
- 64 个谓词寄存器 p0 到 p63。
- 8 个分支寄存器 b0 到 b7。
- 指令指针,Windows 调试引擎出于某种原因将其称为 iip。 (多出来的“i”是“疯狂”的意思?)
- 128个特殊用途寄存器,并非所有寄存器都已被赋予含义。由于某种原因,这些被称为“应用程序寄存器”(ar)。我将讨论讨论期间出现的选定寄存器。
- 其他杂项寄存器我们不会在本系列中介绍。
安腾处理器,第 1 部分:预热
阅读更多内容x64 和 IA-64 有什么区别?