在哪里可以找到此架构上用于组装的新寄存器的名称?
我指的是 X86 中的寄存器,如 EAX、ESP、EBX 等。但我希望它们是 64 位的。
我认为它们与我反汇编 C 代码时不同,我得到的是 r 而不是 e。
在哪里可以找到此架构上用于组装的新寄存器的名称?
我指的是 X86 中的寄存器,如 EAX、ESP、EBX 等。但我希望它们是 64 位的。
我认为它们与我反汇编 C 代码时不同,我得到的是 r 而不是 e。
MSDN 文档包含有关 x64 寄存器的信息 。
x64 将 x64 的 8 个通用寄存器扩展为 64 位,并增加了 8 个新的 64 位寄存器。64 位寄存器的名称以“r”开头,因此例如 eax 的 64 位扩展名称为 rax。新寄存器命名为 r8 到 r15。
每个寄存器的低 32 位、16 位和 8 位可在操作数中直接寻址。这包括寄存器,如 esi,其低 8 位以前无法寻址。下表指定了 64 位寄存器低位部分的汇编语言名称。
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
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 位,即r
寄存器(rax
、rbx
等rsp
)。
此外,还有一些额外的通用寄存器,也可以r8
通过r15
它们访问(例如)r8d
和r8w
(r8b
分别为低 32 位双字、16 位字和 8 位字节)。b
后缀是原始的 AMD 命名法,但有时您会看到它写为(l
小写L
)表示“低字节”。
我自己更喜欢b
后缀(即使当前的低字节寄存器是al
,bl
等),因为它与d/w = double/word
名称匹配并且l
可能被误认为long
. 或者,更糟糕的是,数字1
,导致您质疑注册号81
是什么:-)
在许多情况下,旧的 16 位寄存器的高字节仍然可以访问,例如ah
、等(尽管对于新的直通寄存器bh
来说似乎不是这种情况)。有一些新的指令编码,特别是那些使用前缀的,不能访问那些原始的高字节,但其他人仍然可以免费使用它们。r8
r15
REX
此外,还有一些新的 SSExmm8
寄存器xmm15
。
eip
andeflags
寄存器也被扩展为rip
and rflags
(虽然高 32 位目前rflags
仍未使用)。
特定 C 编译器的关键字是否支持这些asm
,我不能说。我所做的小组装(现在大约一年一天)是在组装而不是 C 中完成的。
有关的:
X64 对 32 位通用寄存器的扩展如下:
EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP
X64 还增加了以下 64 位通用寄存器:
R8, R9, R10, R11, R12, R13, R14, R15
此外,SSE 是 X64 规范的一部分,因此 xmm0-xmm15 向量寄存器也可用
您可以在Wikipedia/X86-64或访问英特尔网站上找到有关架构的一些基本信息。
让我们阅读英特尔手册
在哪里可以找到此架构上用于组装的新寄存器的名称。
在处理器手册“Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture”中,例如版本 253665-053US:
在该部分:
如果指定了 64 位操作数大小:RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8-R15 可用。R8D-R 15D/R8-R15 代表八个新的通用寄存器。
提醒:64 位模式是 x86-64 中的“正常”模式。另一种主要模式是模拟 IA32 的“兼容模式”。
如果您继续在 TOC 上搜索“寄存器”,您还会在手册中找到有关浮点和 SIMD 的“数字粉碎”寄存器的部分:
还有更多的控制寄存器具有各种副作用,通常不能写入,除非您想要这些效果(并且通常需要 ring 0)。这些在“第 3 卷系统编程指南 - 2.1.6 系统寄存器”中进行了总结,更适合 OS 开发人员。
一个好的经验方法是info all-registers
在 GDB 中运行:How to print register values in GDB?