在这种架构下,我在哪里可以找到汇编语言的新寄存器名称?
我的意思是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
mov ah,r8b
或类似的东西吗?你不能在REX前缀中使用高8寄存器。REX mov ah,0
就是mov spl,0
,以此类推(当有REX前缀时,AH / CH / DH / BH
的编码意味着spl / bpl / sil / dil
(按照机器代码中的顺序))。 - Peter Cordes旧的32位寄存器已经扩展到64位,包括 r
寄存器 (rax
, rbx
, rsp
等)。
此外,还有一些额外的通用寄存器,r8
到 r15
,可以通过(例如)r8d
、r8w
和 r8b
访问(分别表示低32位双字、16位字和8位字节)。后缀 b
是原始的 AMD 命名法,但有时会将其写成小写的 l
,表示“低字节”。
我自己倾向于使用 b
后缀(即使当前的低字节寄存器是 al
、bl
等),因为它与 d/w = double/word
名称相匹配,而 l
可能会被误解为 long
。或者更糟糕的是,数字 1
,导致你质疑寄存器号 81
是什么意思 :-)
旧的16位寄存器的高字节在许多情况下仍然可以访问,例如作为 ah
、bh
等(尽管在新的 r8
到 r15
寄存器中似乎不是这样)。一些新的指令编码,特别是使用 REX
前缀的编码,无法访问这些原始高字节,但其他指令仍然可以使用它们。
此外,还有一些新的 SSE 寄存器,xmm8
到 xmm15
。
eip
和 eflags
寄存器也已扩展为 rip
和 rflags
(尽管目前 rflags
的高32位仍未使用)。
我无法确定这些是否在特定C编译器的asm
关键字中得到支持。我所做的少量汇编语言(现在每年只有一天)都是用汇编语言而不是C来完成的。
相关:
e
意味着扩展的,而 r
则意味着真正的扩展 :-) - paxdiabloREX
前缀时,您不能使用上半部分 (ah
, bh
, ch
, dh
),因为它们被映射到其他寄存器的下半部分 (si
, bp
, sp
, di
)。这意味着如果您在 r8
中存储了一个地址,则不能将 ah
的内容移动到该地址。 - Fotissil
,那不会影响ah
内容的后续内容。 - paxdiabloEAX -> 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
让我们阅读英特尔手册
在这个架构上,我在哪里可以找到汇编语言的新寄存器名称。
在处理器的手册“Intel 64和IA-32体系结构软件开发人员手册卷1:基本架构”中,例如版本253665-053US:
在该部分中:
提醒:在x86-64中,64位模式是“正常”模式。另一个主要模式是“兼容模式”,它模拟IA32。如果指定了64位操作数大小:RAX、RBX、RCX、 RDX、RDI、RSI、RBP、RSP、R8-R15可用。R8D-R 15D/R8-R15代表八个新的通用寄存器。
info all-registers
命令:如何在GDB中打印寄存器的值?
inc ah
是无效的,因为该操作码已被重用于新的64位寄存器之一。 - Johan