X64汇编语⾔寄存器结构及与X86架构编程区别
⽬录
1.  关于X64架构
X64结构是⼀个向后兼容的X86结构的扩展。它提供了⼀个传统的32位模式。实际上,它等同于⼀个X86模式,和⼀个新的64位模式。2.  X64架构的寄存器结构
2.1  通⽤⽬的寄存器
X64将X86的8个通⽤寄存器扩展为64位,增加了8个新的通⽤64位寄存器。64位寄存器的名称都以字母“r”开头(当然,寄存器名称不区分⼤⼩写,也可以是“R”开头),例如,eax的64位扩展寄存器命名为rax,新增加的寄存器命名从r8到r15。
每个寄存器的低32位,低16位,低8位可在操作数中直接寻址。这包括像esi这样的寄存器,其低8位在以前是不能直接寻址的。下⾯的列表指出了64位通⽤寄存器的低位名称。
64位低32位低16位低8位描述
rax eax ax al累加器
rbx ebx bx bl基地址
rcx ecx cx cl循环记数器
rdx edx dx dl数据寄存器,通常扩展A寄存器
rsi esi si sil字符串操作的源索引
rdi edi di dil字符串操作的⽬的索引
rbp ebp bp bpl栈指针
rsp esp sp spl基地址指针(栈帧基地址)
r8r8d r8w r8b新增通⽤寄存器
r9r9d r9w r9b新增通⽤寄存器
r10r10d r10w r10b新增通⽤寄存器
r11r11d r11w r11b新增通⽤寄存器
r12r12d r12w r12b新增通⽤寄存器
r13r13d r13w r13b新增通⽤寄存器
r14r14d r14w r14b新增通⽤寄存器
r15r15d r15w r15b新增通⽤寄存器
注意:使⽤REX.W指令前缀时,不能访问AH、BH、CH 和 DH。当操作数包含 64 位寄存器时,会添加此前缀(由汇编程序⾃动添加)。
输出到32位⼦寄存器的操作数⾃动零扩展到整个64位寄存器(注:0扩展不影响符号位,因为有符号数最⾼位为1才表⽰负数)。输出到8位和16位字寄存器的操作数不是0扩展(这是为了兼容x86的⾏为)。
ax、bx、cx和dx的⾼ 8 位仍可寻址为ah、bh、ch、dh,但不能与所有类型的操作数⼀起使⽤。
指令指针寄存器eip和标识寄存器flags已被分别扩展为64位。
2.2 浮点数寄存器
x64处理器也提供了⼏套浮点寄存器:
8个80位x87 寄存器。
8个64位MMX寄存器。(这些与x87 寄存器重叠)
原来的8个128位SSE寄存器增加到16个。
2.3 指令指针寄存器
指令指针寄存器rip和标识寄存器flags已被分别扩展为64位。
注意:指令指针只能⽤于rip相对寻址,它是在long模式中引⼊的。
名称
64位32位16位
RIP EIP IP
2.4 段寄存器
段寄存器全部为16位长。
名称描述
CS代码段
DS数据段
SS堆栈段
ES扩展段 (⽤于字符串操作)
FS通⽤⽬的段
GS通⽤⽬的段
⽆论GDT中的段描述符是什么,CS、DS、ES 和 SS的段都被视为它们的基数为 0。FS 和 GS 例外,它们有 MSR 来改变它们的基数。对所有段禁⽤限制检查。
2.5 标识寄存器
位标识描述
0CF进位标识(Carry Flag)
11保留(Reserved)
2PF校验标识(Parity Flag)
30保留(Reserved)
4AF辅助进位标识(Auxiliary Carry Flag)
50保留(Reserved)
6ZF零标识(Zero Flag)
7SF符号标识(Sign Flag)
8TF陷阱标识(Trap Flag)
9IF中断使能标识(Interrupt Enable Flag)
10DF⽅向标识(Direction Flag)
11OF溢出标识(Overflow Flag)
12-13IOPL I/O特权级别标识(I/O Privilege Level)
14NT嵌⼊任务标识(Nested Task)
150保留(Reserved)
16RF恢复标识(Resume Flag)
17VM虚拟8086标识(Virtual-8086 Mode)
18AC对齐检查/访问控制标识(Alignment Check / Access Control)
19VIF虚拟中断标识(Virtual Interrupt Flag)
20VIP虚拟中断挂起标识(Virtual Interrupt Pending)
21ID⾝份标识(ID Flag)
22-630保留(Reserved)
2.6 控制寄存器
2.6.1 控制寄存器CR0
位标识描述
0PE保护模式使能标识(Protected Mode Enable) 1MP监控协处理器(Monitor Co-Processor)
2EM枚举标识(Emulation)
3TS任务切换标识(Task Switched)
4ET扩展标识(Extension Type)
5NE数字错误标识(Numeric Error)
6-150保留(Reserved)
16WP写⼊保护标识(Write Protect)
170保留(Reserved)
汇编语言大小写字母转换18AM对齐掩码标识(Alignment Mask)
19-280保留(Reserved)
29NW⾮直写标识(Not-Write Through)
30CD缓存禁⽤标识(Cache Disable)
31PG分页标识(Paging)
32-630保留(Reserved)
请注意,该寄存器是唯⼀可以通过 2 种⽅式读写的控制寄存器,⽽其他控制寄存器只能通过 MOV 指令访问
2.6.2 控制寄存器CR2
该控制寄存器包含触发页⾯错误的线性(虚拟)地址,可在页⾯错误的中断处理程序中使⽤。
2.6.3 控制寄存器CR3
位标识标述条件
0-110-20保留(Reserved)
CR4.PCIDE = 0 3PWT
页级直写(Page-Level Write
Through)
5PCD
页级缓存禁⽤(Page-Level
Cache Disable)
5-110保留(Reserved)
0-11PCID CR4.PCIDE = 1
12-63PML4的物理基地址(Physical Base Address of the PML4)
请注意,这必须是页⾯对齐的
2.6.4 控制寄存器CR4
位标识描述
0VME虚拟8086模式扩展(Virtual-8086 Mode Extensions)
1PVI保护模式虚拟中断(Protected Mode Virtual Interrupts)
2TSD仅0环时间戳启⽤(Time Stamp enabled only in ring 0)
3DE调试扩展(Debugging Extensions)
4PSE分页扩展(Page Size Extension)
5PAE物理地址扩展(Physical Address Extension)
6MCE主机检查异常(Machine Check Exception)
7PGE分页全局使能(Page Global Enable)
8PCE性能监控计数使能(Performance Monitoring Counter Enable)
9OSFXSR操作系统⽀持fxsave 和fxrstor 指令(OS support for fxsave and fxrstor instructions)
10OSXMMEXCPT操作系统⽀持未屏蔽的simd浮点异常(OS Support for unmasked simd floating point exceptions)
11UMIP ⽤户模式指令预防(User-Mode Instruction Prevention (SGDT, SIDT, SLDT, SMSW, 和STR在⽤户模式是禁⽤的))
120保留(Reserved)
13VMXE虚拟机扩展使能(Virtual Machine Extensions Enable) 14SMXE更安全的模式扩展使能(Safer Mode Extensions Enable) 150保留(Reserved)
17PCIDE PCID 使能PCID Enable)
18OSXSAVE XSAVE 和处理器扩展状态使能(XSAVE And Processor Extended States Enable)
190保留(Reserved)
20SMEP监督模式执⾏保护使能(Supervisor Mode Executions Protection Enable)
21SMAP监督模式访问保护使能(Supervisor Mode Access Protection Enable)
22PKE⽤户模式分页使能保护密钥(Enable protection keys for user-mode pages)
23CET控制流执⾏技术使能(Enable Control-flow Enforcement Technology)
24PKS监督模式分页使能保护密钥(Enable protection keys for supervisor-mode pages)
25-
0保留(Reserved)
63
2.6.5 控制寄存器CR8
CR8是64位模式下的⼀个使⽤REX前缀可访问的新的寄存器。CR8⽤于优秀处理外部中断,并且被称为是任务优先级寄存器(Task-priority register,简记为TPR。AMD64架构允许软件定义最多15个外部中断优先类。优先分类标号从1到15,其中,1是最低级优先级分类,15是最⾼优先级分类。CR8使⽤低序4位来指定任务优先级,⽽将其余60位保留且必须都置为0。系统软件可以使⽤ TPR寄存器临时阻⽌低优先级中断去中断⾼优先级任务。这是通过将对应的要被阻⽌的最⾼优先级中断的值载⼊TPR来达成的。例如,将⼀个值9(对应的⼆进制是1001)载⼊TPR屏蔽所有中断优先级⼩于等于9的所有中断,
⽽允许中断优先级⼤于等于10的中断被识别。将0载⼊TPR则允许所有外部中断。将15(对应⼆进制1111)载⼊TPR则禁⽌所有外部中断。复位时,TPR被置为0。
位⽬的
0-3优先极
4-63保留
2.6.6 控制寄存器CR1,CR5-7, CR9-15
保留,当试图访问这些寄存器的时候,CPU将抛出⼀个#ud异常。
2.7  模式指定寄存器(MSRs)(Model Specific Registers)
2.7.1 IA32  EFER寄存器
扩展特征使能寄存器(EFER)(Extend Feature Enable Register)是AMD K6处理器中加⼊的模式指定寄存器,允许启⽤SYSCALL/SYSRET指令,⽽后是为了进⼊和退出长模式(long mode),该寄存器在AMD64中成为体系结构,被已被Intel采⽤。它的它的 MSR 编号是 0xC0000080。
位标识描述
0SCE系统调⽤扩展(System Call Extensions)
1-70保留
8LME长模式使能(Long Mode Enable)
10LMA长模式激活(Long Mode Active)
11NXE⾮执⾏使能(No-Execute Enable)
12SVME安全虚拟机使能(Secure Virtual Machine Enable)
13LMSLE长模式段限制使能(Long Mode Segment Limit Enable)
14FFXSR快速FXSAVE/ FXRSTOR( Fast FXSAVE/FXRSTOR)