查看“CPU Registers x86-64”的源代码
←
CPU Registers x86-64
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[Category:CPU_Registers]] {{Disputed|Talk:CPU_Registers_x86-64}} == 通用寄存器 == {| class="wikitable" border="1" |- ! colspan=5 | 名称(Monikers) ! rowspan=2 | 描述 |- ! 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) == {| class="wikitable" border="1" |- ! colspan=3 | 名称(Monikers) ! rowspan=2 | 描述 |- ! 64-bit ! 32-bit ! 16-bit |- | RIP | EIP | IP | 指令指针(Instruction Pointer) |- |} 注意: 指令指针只能在RIP-相对寻址(RIP-relative addressing)中使用,这是在长模式(long mode)中引入的。 == 段寄存器(Segment Registers) == 所有这些都是16位长。 {| class="wikitable" border="1" |- ! 名称(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) {| class="wikitable" border="1" |- ! 位 ! 标记 ! 描述 |- | 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==== {| class="wikitable" border="1" |- ! 位 (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指令访问 <source lang="asm"> ;方式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) ; 同上 </source> ====CR2==== 此控制寄存器包含触发页错误(page fault)的线性 (虚拟) 地址,可在页错误的中断处理程序中使用。 ====CR3==== {| class="wikitable" border="1" |- ! colspan=2 | 位 ! 标记 ! 描述 ! 条件 |- | rowspan=4 | 0-11 | 0-2 | 0 | 保留 | rowspan=4 | CR4.PCIDE = 0 |- | 3 | PWT | 页面级直写(Page-Level Write Through) |- | 5 | PCD | 关闭页级缓存(Page-Level Cache Disable) |- | 5-11 | 0 | 保留 |- | colspan=2 | 0-11 | colspan=2 | PCID | CR4.PCIDE = 1 |- | colspan=2 | 12-63 | colspan=2 | PML4的物理基址(Page-Level Cache Disable) |- |} 请注意,这必须与页面对齐 ====CR4==== {| class="wikitable" border="1" |- !位 (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用于确定外部[[interrupts|中断]]的优先级,称为任务优先级寄存器(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清零。 {| class="wikitable" border="1" |- !位 !意图 |- |0-3 |优先级(Priority) |- |4-63 | 保留 |} ====CR1, CR5-7, CR9-15==== 保留,cpu在试图访问它们时会抛出#ud exeption。 ==MSRs== ====IA32_EFER==== 扩展功能启用寄存器(EFER)是AMD K6处理器中添加的[[MSR|型号特定寄存器(model-specific register)]],用于启用SYSCALL/SYSRET指令,以及稍后用于进入和退出[[x86-64|长模式]]。 该寄存器在 [[AMD64]] 中成为架构设计,并已被英特尔采用。 其MSR编号为0xC0000080。 {| class="wikitable" border="1" |- ! 位 ! 标记 ! 描述 |- | 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==== {| class="wikitable" border="1" |- ! 位 ! 描述 |- | 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断点大小 |- |} 硬件任务切换的本地断点位被停用,而全局则没有。<br><br> 00b条件表示执行中断,01b表示写入观察点(watchpoint),11b表示R/W观察点。10b是为I/O R/W保留的(不支持)。 ==测试寄存器(Test Registers)== {| class="wikitable" border="1" |- ! 名称 ! 描述 |- | TR3 - TR5 |无文档记录 |- | TR6 | 测试命令寄存器(Test Command Register) |- | TR7 |测试数据寄存器(Test Data Register) |- |} ==保护模式寄存器(Protected Mode Registers)== ====GDTR==== {| class="wikitable" border="1" |- ! colspan=2 | 操作数大小 ! rowspan=2 | 标记 ! rowspan=2 | 描述 |- ! 64-bit ! 32-bit |- | colspan=2 style="text-align:center" | Bits 0-15 | Limit | [[GDT]]的大小 |- | Bits 16-79 | Bits 16-47 | Base | GDT的起始地址 |- |} ====LDTR==== 存储[[LDT]]的段选择器。 ====TR==== 存储 [[TSS]] 的分段选择器。 ====IDTR==== {| class="wikitable" border="1" ! colspan=2 |操作数大小 ! rowspan=2 | 标记 ! rowspan=2 | 描述 |- ! 64-bit ! 32-bit |- | colspan=2 style="text-align:center" | Bits 0-15 | Limit | [[IDT]] 的大小 |- | Bits 16-79 | Bits 16-47 | Base | IDT的起始地址 |- |}
本页使用的模板:
模板:DiscussThis
(
查看源代码
)
模板:Disputed
(
查看源代码
)
返回至“
CPU Registers x86-64
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息