在哪里可以找到用于此体系结构的新寄存器的名称?
我指的是X86中的寄存器,如EAX,ESP,EBX等。但我喜欢它们的64位。
我不认为它们与我拆解C代码时的情况相同,我得到r而不是e。
答案 0 :(得分:94)
MSDN documentation包含有关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
答案 1 :(得分:70)
旧的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
等访问(尽管新的{似乎不是这种情况) {1}}通过r8
寄存器)。有一些新的指令编码,特别是那些使用r15
前缀的编码,它们无法访问那些原始的高字节,但其他人仍可以自由使用它们。
此外,还有一些新的SSE寄存器REX
虽然xmm8
。
xmm15
和eip
寄存器也已扩展为eflags
和rip
(尽管rflags
的高32位仍然是未使用的)。
有关详细信息,请参阅wikipedia page和MSDN。
对于特定的C编译器,rflags
关键字是否支持这些,我不能说。我做的小装配(并且它每年大约一天)是在装配而不是C中完成的。
相关:
答案 2 :(得分:9)
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找到有关该架构的一些基本信息,或访问英特尔网站。
答案 3 :(得分:6)
让我们阅读英特尔手册
在哪里可以找到用于此体系结构的新寄存器的名称。
在处理器手册“Intel 64和IA-32架构软件开发人员手册第1卷:基本架构”中,例如version 253665-053US:
在该部分:
如果指定了64位操作数大小:RAX,RBX,RCX, 可提供RDX,RDI,RSI,RBP,RSP,R8-R15。 R8D-R 15D / R8-R15代表八个新的通用寄存器。
提醒:64位模式是x86-64中的“正常”模式。另一种主要模式是模拟IA32的“兼容模式”。
如果您继续在TOC上搜索“register”,您还会在手册中找到有关浮点和SIMD的“数字破碎”寄存器的部分:
还有更多的控制寄存器具有各种副作用,除非您需要这些效果(通常为require ring 0),否则通常无法写入。这些在“第3卷系统编程指南”中进行了总结 - 2.1.6系统寄存器“,更多适用于OS开发人员。
一个好的经验方法是在GDB中运行info all-registers
:How to print register values in GDB?