CPU Registers x86-64
通用寄存器
名称(Monikers) | 描述 | ||||
---|---|---|---|---|---|
64-bit | 32-bit | 16-bit | 低16位中的8高位 | 8-bit | |
RAX | EAX | AX | AH | AL | 累加器(Accumulator) |
RBX | EBX | BX | BH | BL | 基址(Base) |
RCX | ECX | CX | CH | CL | 计数器(Counter) |
RDX | EDX | DX | DH | DL | 数据(Data - 通常用于扩展A寄存器) |
RSI | ESI | SI | N/A | SIL | 字符串操作源索引(Source index for string operations) |
RDI | EDI | DI | N/A | DIL | 字符串操作的目标索引(Destination index for string operations) |
RSP | ESP | SP | N/A | SPL | 堆栈指针(Stack Pointer) |
RBP | EBP | BP | N/A | BPL | 基址指针(Base Pointer 用于堆栈帧) |
R8 | R8D | R8W | N/A | R8B | 通用 |
R9 | R9D | R9W | N/A | R9B | 通用 |
R10 | R10D | R10W | N/A | R10B | 通用 |
R11 | R11D | R11W | N/A | R11B | 通用 |
R12 | R12D | R12W | N/A | R12B | 通用 |
R13 | R13D | R13W | N/A | R13B | 通用 |
R14 | R14D | R14W | N/A | R14B | 通用 |
R15 | R15D | R15W | N/A | R15B | 通用 |
注意:使用REX.W指令前缀(译者注:REX前缀是在64位模式下使用的指令前缀字节,是机器编码的一种扩展)时,不能访问AH、BH、CH和DH。 当操作数包含64位寄存器时,会添加此前缀 (由汇编器自动添加)。
指针寄存器(Pointer Registers)
名称(Monikers) | 描述 | ||
---|---|---|---|
64-bit | 32-bit | 16-bit | |
RIP | EIP | IP | 指令指针(Instruction Pointer) |
注意: 指令指针只能在RIP-相对寻址(RIP-relative addressing)中使用,这是在长模式(long mode)中引入的。
段寄存器(Segment Registers)
所有这些都是16位长。
名称(Monikers) | 描述 |
---|---|
CS | 代码段(Code Segment) |
DS | 数据段(Data Segment) |
SS | 栈段(Stack Segment) |
ES | 额外段(Extra Segment 用于字符串操作) |
FS | 通用段 |
GS | 通用段 |
CS、DS、ES和SS的段被视为基址为0,无论GDT中的段描述符如何表示。 例外是FS和GS,它们有MSR来更改它们的基址。
所有段的限制检查均被禁用。
RFLAGS寄存器
(译者注:在x64架构下,原来的eflags寄存器升级成了64位的rflags)
位 | 标记 | 描述 |
---|---|---|
0 | CF | 进位标志(Carry Flag) |
1 | 1 | 保留 |
2 | PF | 奇偶校验标志(Parity Flag) |
3 | 0 | 保留 |
4 | AF | 辅助进位标志(Auxiliary Carry Flag) |
5 | 0 | 保留 |
6 | ZF | 零标志(Zero Flag) |
7 | SF | 符号标志(Sign Flag) |
8 | TF | 陷阱标志(Trap Flag) |
9 | IF | 中断启用标志(Interrupt Enable Flag) |
10 | DF | 方向标志(Direction Flag) |
11 | OF | 溢出标志(Overflow Flag) |
12-13 | IOPL | I/O权限级别(I/O Privilege Level) |
14 | NT | 嵌套任务(Nested Task) |
15 | 0 | 保留 |
16 | RF | 恢复标志(Resume Flag) |
17 | VM | 虚拟8086模式(Virtual-8086 Mode) |
18 | AC | 对齐检查/访问控制(Alignment Check / Access Control) |
19 | VIF | 虚拟中断标志(Virtual Interrupt Flag) |
20 | VIP | 虚拟中断待处理(Virtual Interrupt Pending) |
21 | ID | 身份标志(ID Flag) |
22-63 | 0 | Reserved |
控制寄存器(Control Registers)
CR0
位 (s) | 标记 | 描述 |
---|---|---|
0 | PE | 保护模式启用(Protected Mode Enable) |
1 | MP | 监视器协处理器(Monitor Co-Processor) |
2 | EM | 仿真(Emulation) |
3 | TS | 任务切换(Task Switched) |
4 | ET | 扩展类型(Extension Type) |
5 | NE | 数值错误(Numeric Error) |
6-15 | 0 | 保留 |
16 | WP | 写保护(Write Protect) |
17 | 0 | 保留 |
18 | AM | 对齐掩码(Alignment Mask) |
19-28 | 0 | 保留 |
29 | NW | 非直写(Not-Write Through) |
30 | CD | 缓存禁用(Cache Disable) |
31 | PG | 分页(Paging) |
32-63 | 0 | 保留 |
请注意,此寄存器是唯一可以通过两种方式写入和读取的控制寄存器,而其他方式只能通过MOV指令访问
;方式1:
;写入:
mov cr0,reg32(64)
;读取:
mov reg32(64),cr0
;----------------------
;方式2:
;写入:
lmsw reg16(32/64) ; lms(w)中的“w”代表word(16位),但指令本身可以使用指令重写修改cr0的上48位。
;读取:
smsw reg16(32/64) ; 同上
CR2
此控制寄存器包含触发页错误(page fault)的线性 (虚拟) 地址,可在页错误的中断处理程序中使用。
CR3
位 | 标记 | 描述 | 条件 | |
---|---|---|---|---|
0-11 | 0-2 | 0 | 保留 | CR4.PCIDE = 0 |
3 | PWT | 页面级直写(Page-Level Write Through) | ||
5 | PCD | 关闭页级缓存(Page-Level Cache Disable) | ||
5-11 | 0 | 保留 | ||
0-11 | PCID | CR4.PCIDE = 1 | ||
12-63 | PML4的物理基址(Page-Level Cache Disable) |
请注意,这必须与页面对齐
CR4
位 (s) | 标记 | 描述 |
---|---|---|
0 | VME | 虚拟8086模式扩展(Virtual-8086 Mode Extensions) |
1 | PVI | 保护模式虚拟中断(Protected Mode Virtual Interrupts) |
2 | TSD | 时间戳仅在环0中启用(Time Stamp enabled only in ring 0) |
3 | DE | 调试扩展(Debugging Extensions) |
4 | PSE | 页面大小扩展(Page Size Extension) |
5 | PAE | 物理地址扩展(Physical Address Extension) |
6 | MCE | 机器检查异常(Machine Check Exception) |
7 | PGE | 页面全局启用(Page Global Enable) |
8 | PCE | 启用性能监控计数器(Performance Monitoring Counter Enable) |
9 | OSFXSR | 操作系统对fxsave和fxrstor指令的支持 |
10 | OSXMMEXCPT | OS支持无掩码simd浮点异常 |
11 | UMIP | 用户模式指令保护(用户态关闭SGDT、SIDT、SLDT、SMSW、STR) |
12 | 0 | 保留 |
13 | VMXE | 虚拟机扩展支持(Virtual Machine Extensions Enable) |
14 | SMXE | 启用安全模式扩展(Safer Mode Extensions Enable) |
15 | 0 | 保留 |
16 | FSGSBASE | Enables the instructions RDFSBASE, RDGSBASE, WRFSBASE, and WRGSBASE |
17 | PCIDE | PCID启用 |
18 | OSXSAVE | XSAVE和处理器扩展状态启用 |
19 | 0 | 保留 |
20 | SMEP | 监控模式执行保护启用(Supervisor Mode Executions Protection Enable) |
21 | SMAP | 启用Supervisor模式访问保护(Supervisor Mode Access Protection Enable) |
22 | PKE | 为用户模式页面启用保护密钥 |
23 | CET | 启用控制流强制技术(Enable Control-flow Enforcement Technology) |
24 | PKS | 启用主管模式页面的保护密钥(Enable protection keys for supervisor-mode pages) |
25-63 | 0 | 保留 |
CR8
CR8是一个新的寄存器,可在64位模式下使用REX前缀访问。 CR8用于确定外部中断的优先级,称为任务优先级寄存器(TPR- task-priority register)。
AMD64体系结构允许软件定义多达15个外部中断优先级类。 优先级等级从1到15进行编号,优先级等级1最低,优先级等级15最高。 CR8使用四个低序位来指定任务优先级,其余60位为保留位,必须用零写入。
系统软件可以使用TPR寄存器来暂时阻止低优先级中断中断高优先级任务。 这是通过向TPR加载与要阻止的最高优先级中断相对应的值来实现的。 例如,加载值为9(1001b)的TPR会阻止优先级为9或更低的所有中断,同时允许识别优先级为10或更高的所有中断。 用0加载TPR启用所有外部中断。 用15(1111b)加载TPR将禁用所有外部中断。
复位时,TPR清零。
位 | 意图 |
---|---|
0-3 | 优先级(Priority) |
4-63 | 保留 |
CR1, CR5-7, CR9-15
保留,cpu在试图访问它们时会抛出#ud exeption。
MSRs
IA32_EFER
扩展功能启用寄存器(EFER)是AMD K6处理器中添加的型号特定寄存器(model-specific register),用于启用SYSCALL/SYSRET指令,以及稍后用于进入和退出长模式。 该寄存器在 AMD64 中成为架构设计,并已被英特尔采用。 其MSR编号为0xC0000080。
位 | 标记 | 描述 |
---|---|---|
0 | SCE | 系统调用扩展(System Call Extensions) |
1-7 | 0 | 保留 |
8 | LME | 长模式启用(Long Mode Enable) |
10 | LMA | 长模式激活(Long Mode Active) |
11 | NXE | 否-启用执行(No-Execute Enable) |
12 | SVME | 安全虚拟机启用(Secure Virtual Machine Enable) |
13 | LMSLE | 长模式段限制启用(Long Mode Segment Limit Enable) |
14 | FFXSR | 快速 FXSAVE/FXRSTOR |
15 | TCE | 转换缓存扩展(Translation Cache Extension) |
16-63 | 0 | 保留 |
FS.base, GS.base
地址为0xC0000100(用于FS)和0xC0000101(用于GS)的MSR包含FS和GS段寄存器的基址。 这些通常用于用户代码中的线程指针和内核代码中的CPU本地指针。 可以安全地包含任何内容,因为使用段不会赋予用户代码额外的权限。
在较新的CPU中,还可以在任何特权级别使用WRFSBASE和WRGSBASE指令写入这些指令。
KernelGSBase
地址为0xC0000102的MSR。 基本上是在swapgs指令之后与GS.base交换的缓冲区。 通常用于分离GS寄存器的内核和用户使用。
调试寄存器(Debug Registers)
DR0 - DR3
最多包含4个断点的线性地址。 如果启用了分页,则将它们转换为物理地址。
DR6
它允许调试器确定发生了哪些调试条件。 启用调试异常时,在进入调试异常处理程序之前设置低位0-3。
DR7
位 | 描述 |
---|---|
0 | 本地DR0断点 |
1 | 全局DR0断点 |
2 | 本地DR1断点 |
3 | 全局DR1断点 |
4 | 本地DR2断点 |
5 | 全局DR2断点 |
6 | 本地DR3断点 |
7 | 全局DR3断点 |
16-17 | DR0的条件 |
18-19 | DR0断点大小 |
20-21 | DR1的条件 |
22-23 | DR1断点的大小 |
24-25 | 适用于DR2的条件 |
26-27 | DR2断点的大小 |
28-29 | DR3的条件 |
30-31 | DR3断点大小 |
硬件任务切换的本地断点位被停用,而全局则没有。
00b条件表示执行中断,01b表示写入观察点(watchpoint),11b表示R/W观察点。10b是为I/O R/W保留的(不支持)。
测试寄存器(Test Registers)
名称 | 描述 |
---|---|
TR3 - TR5 | 无文档记录 |
TR6 | 测试命令寄存器(Test Command Register) |
TR7 | 测试数据寄存器(Test Data Register) |
保护模式寄存器(Protected Mode Registers)
GDTR
操作数大小 | 标记 | 描述 | |
---|---|---|---|
64-bit | 32-bit | ||
Bits 0-15 | Limit | GDT的大小 | |
Bits 16-79 | Bits 16-47 | Base | GDT的起始地址 |
LDTR
存储LDT的段选择器。
TR
存储 TSS 的分段选择器。
IDTR
操作数大小 | 标记 | 描述 | |
---|---|---|---|
64-bit | 32-bit | ||
Bits 0-15 | Limit | IDT 的大小 | |
Bits 16-79 | Bits 16-47 | Base | IDT的起始地址 |