Assembly 新X86_64处理器寄存器的名称是什么?

Assembly 新X86_64处理器寄存器的名称是什么?,assembly,x86,x86-64,cpu-registers,Assembly,X86,X86 64,Cpu Registers,在何处可以找到此体系结构上用于组装的新寄存器的名称 我指的是X86中的寄存器,如EAX、ESP、EBX等,但我希望它们是64位的 我不认为它们与我反汇编C代码时得到的是r而不是e是一样的 旧的32位寄存器已扩展到64位,r寄存器(rax,rbx,rsp等等) 此外,还有一些额外的通用寄存器r8到r15,它们也可以访问为(例如)r8d、r8w和r8b(分别是较低的32位双字、16位字和8位字节)。b后缀是最初的AMD术语,但有时您会看到它被写成l(小写l)表示“低字节” 我自己倾向于选择b后缀(即

在何处可以找到此体系结构上用于组装的新寄存器的名称

我指的是X86中的寄存器,如EAX、ESP、EBX等,但我希望它们是64位的


我不认为它们与我反汇编C代码时得到的是r而不是e是一样的

旧的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
,这会让您质疑heck寄存器编号
81
是什么:-)

在许多情况下,旧16位寄存器的高位字节仍然可以访问,如
ah
bh
,等等(尽管新的
r8
r15
寄存器的情况似乎并非如此)。有一些新的指令编码,特别是那些使用
REX
前缀的指令编码,无法访问原始的高字节,但其他指令编码仍然可以自由使用它们

此外,还有一些新的SSE寄存器,
xmm8
尽管
xmm15

eip
eflags
寄存器也已扩展到
rip
rflags
(尽管
rflags
的高32位目前仍未使用)

有关更多详细信息,请参阅和

对于特定的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矢量寄存器也可用

您可以在英特尔网站上找到有关该体系结构的一些基本信息。

包括有关x64寄存器的信息

x64扩展了x64的8通用功能 寄存器为64位,并添加8个新的 64位寄存器。64位寄存器 名字以“r”开头,所以 示例eax的64位扩展是 叫rax。新的登记册是 命名为r8到r15

较低的32位、16位和8位 每个寄存器的 可在操作数中寻址的。这包括 寄存器,如esi,其下限为8 位以前不可寻址。 下表指定了 较低版本的汇编语言名称 64位寄存器的一部分


让我们阅读英特尔手册

在哪里可以找到此体系结构上用于组装的新寄存器的名称

在处理器手册“英特尔64和IA-32体系结构软件开发人员手册第1卷:基本体系结构”中,例如:

  • 搜索“注册表”
  • 第一个匹配项是索引“3.4基本程序执行寄存器”
  • “3.4.1.1 64位模式下的通用寄存器”下面的两项
关于该部分:

如果指定了64位操作数大小:RAX、RBX、RCX、, 可提供RDX、RDI、RSI、RBP、RSP、R8-R15。R8D-R 15D/R8-R15代表八个新的通用寄存器

提醒:64位模式是x86-64中的“正常”模式。另一个主要模式是模拟IA32的“兼容性模式”

如果您继续在TOC上搜索“寄存器”,您还将在手册中找到有关浮点和SIMD的“数字破碎”寄存器的章节:

  • 8.1.2-x87 FPU数据寄存器(STx)
  • 9.9.2-MMX寄存器
  • 10.2.2-XMM寄存器
  • 14.1.1-256位宽SIMD寄存器支持(YMM)
还有更多的控制寄存器具有各种副作用,通常无法写入,除非您想要这些效果(通常)。这些内容在“第3卷系统编程指南”中进行了总结 -2.1.6“系统寄存器”,这对操作系统开发人员来说更为重要


一个好的经验方法是在GDB中运行
info all registers

伙计们,在执行系统调用时,我如何判断哪些寄存器与参数相关。我一直在阅读和文档,没有找到明确的答案。请注意,旧的高8位寄存器(ah、bh等)不再适用于所有操作码。e、 g.
inc ah
在x64中无效,因为该操作码已被重新用于一个新的64位寄存器。@Johan:还要注意,使用REX前缀,ah bh ch dh的寄存器代码将成为新的字节寄存器sil dil bplspl@int80,不知道。也许
e
表示扩展,而
r
表示真正扩展:-)我知道“e”代表扩展(从16位开始)。但是r?但是你的答案是正确的,这是不正确的。使用
REX
前缀时,不能使用上半部分(
ah
bh
ch
dh
),因为它们分别映射到其他寄存器的下半部分(
si
bp
sp
di
)。这意味着如果您在
r8
中存储了地址,则无法将
ah
的内容移动到此地址。@Fotis,哪个bi
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