IA-32 保护模式下寄存器一览

最近在看张银奎先生的《调试软件》一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧。

 

1 通用寄存器

EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等16位或AL,AH等8位短寄存器,访问长寄存器的相应地址

ESP,EBP:Extended Stack/Base Pointer,指栈顶和当前栈的起始地址

ESI,EDI:源和目标寄存器,比如在循环操作中,与ECX组合,分别表示计数器(ECX),起始数(ESI),目标数(EDI)

64位扩展通用寄存器:RAX,RBX, RCX, RDX,R8~R15

 

2 EFLAGS标志寄存器

一共32位,目前只有18位在使用,分为三大类

另外,64位扩展标志寄存器RFLAGS

 

2.1 报告算术指令

标志 所在位 含义
TF (Trap Flag) 8 陷阱标志
IF (Interrupt Enable Flag) 9 中断标志,0禁止响应可屏蔽中断,1打开
IOPL (I/O Privilege Level) 12,13 当前任务(程序)的I/O权限级别
NT (Nested Task Flag) 14 任务嵌套标志,1当前任务是链接到前面执行的任务的,通常是由于中断或异常触发了IDT表中的任务门
RF (Resume Flag) 16 控制处理器对调试异常(#DB)的响应,1暂时禁止由于指令断点(是指通过调试寄存器设置的指令断点)导致的调试异常
VM (Virtual-8086 Mode Flag) 17 1启用虚拟8086模式,清除该位返回到普通的保护模式
AC (Alignment Check Flag) 18 设置此标志和CR0的AM标志可以启用内存对齐检查
VIF (Virtual Interrupt Flag) 19 与VIP标志一起用于实现奔腾处理器引入的虚拟中断机制
VIP (Virtual Interrupt Pending Flag) 20 与VIF标志一起用于实现奔腾处理器引入的虚拟中断机制
ID (Identification Falg) 21 用于检测是否支持CPUID指令,如果能够成功设置和清除该标志,这支持CPUID指令

 

 

 

 

 

 

 

 

 

 

 

2.2 结果状态标志

标志 所在位 含义
CF (Carry Flag) 0 进位或借位
PF (Parity Flag) 2 当计算结果的最低字节中包含偶数个1时,该标志为1
AF (Adjust Flag) 4 辅助进位标志,当位3(半个字节)处有进位或借位标志时为1
ZF (Zero Flag) 6 计算结果为0时,该标志位1,否则为0
SF (Sign Flag) 7 符号标志,结果为负时为1,否则为0
OF (Overflow Flag) 11 移除标志,结果超出机器的表达范围时为1,否则为0

 

 

 

 

 

 

 

2.3 控制字符串指令操作方向的控制标志

标志 所在位 含义
DF (Direction Flag) 10 方向标志,为1时使字符串指令每次操作后递减变址寄存器(ESI和EDI),为0时递增

 

 

 

3 MSR寄存器

Model Specific Register,内容为64位。

读取:先将要读的MSR的ID放到ECX中,然后执行RDMSR,返回值被放到EDX(高32位)和EAX(低32位)

写入:先将要写的MSR的ID放到ECX中,再将要写的数据放到EDX和EAX中,最后执行WRMSR

 

4 控制寄存器

IA-32提供5个控制寄存器CR0~CR4,64位CPU增加了CR8表示任务优先级寄存器

CR1一直保留没用,CR2用于存储导致页错误的线性地址,CR3的高20位表示页目录基地址,其余寄存器说明如下

标志 含义
CR0-00 PE (Protection Enable) 1启用保护模式,0启用实模式
CR0-01 MP (Monitor Coprocessor) 用来控制WAIT/FWAIT指令对TS标志的检查
CR0-02 EM (Emulation) 1表示使用软件来模拟浮点单元(FPU)进行浮点运算,0表示处理器具有内部或外部的FPU
CR0-03 TS (Task Switched) 当CPU在每次切换任务时设置该位,在执行x87 FPU和MMX/SSE/SSE2/SS3指令时检查该位,主要用于支持在任务切换时延迟保存x87 FPU和MMX/SSE/SSE2/SS3上下文
CR0-04 ET (Extension Type) 对于386和486的CPU,1表示支持387数学协处理器指令,对于486以后的IA-32 CPU,该位保留(固定为1)
CR0-05 NE (Numeric Error) 用来控制x87 FPU错误的报告方式,1启用内部的本位(native)机制,0启用与DOS兼容的PC方式
CR0-16 WP (Write Protect) 1禁止内核级代码写用户级的只读存储页,0允许
CR0-18 AM (Alignment Mask) 1启用自动内存对齐检查,0禁止
CR0-29 NW (Not Write-through) 与CD标志共同控制高速缓存有关的选项
CR0-30 CD (Cache Disable) 与NW标志共同控制高速缓存有关的选项
CR0-31 PG (Paging) 1启用页机制,0禁止
==== ================== ===========================================================================================
CR3-03 PCD (Page-level Cache Disable) 控制是否对当前页目录进行高速缓存(caching),1禁止,0允许
CR3-04 PWT (Page-level Write Transparent) 控制页目录的缓存方式,1启用write-through方式缓存,0启用write-back方式缓存
==== ================== ===========================================================================================
CR4-00 VME (Virtual-8086 Mode Extensions) 1启用虚拟8086模式下的中断和异常处理扩展:将中断和异常重定向到8086程序的处理例程以减少调用虚拟8086监视程序(monitor)的开销
CR4-01 PVI  (Protected-Mode Virtual Interrupts) 1启用硬件支持的虚拟中断标志(VIF),0禁止VIF标志
CR4-02 TSD (Time Stamp Disable) 1只有在Ring0特权级才能使用RDTSC指令,0所有特权级都可以使用该指令读取时间戳
CR4-03 DE (Debugging Extensions) 1引用DR4和DR5寄存器将导致无效指令(#UD)异常,0引用DR4和DR5等效于应用DR6和DR7
CR4-04 PSE (Page Size Extensions) 1启用4MB内存页,0限制内存页位4KB
CR4-05 PAE (Physical Address Extension) 1支持36或36位以上的物理内存地址,0只支持32位物理内存
CR4-06 MCE (Machine-Check Enable) 1启用机器检查异常,0禁止
CR4-07 PGE (Page Global Enable) 1启用P6处理器引入的全局页功能,0禁止
CR4-08 PCE (Performance-Monitoring COunter Enable) 1允许所有特权级的代码使用RDPMC指令读取性能计数器,0只有Ring0特权级的才能使用RDPMC指令
CR4-09 OSFXSR (Operationg System Support for

FXSAVE and FXRSTOR instructions)

操作系统使用,表示操作系统对FXSAVE、FXRSTOR及SSE/SSE2/SSE3指令的支持,以保证较老的操作系统仍然可以运行在较新的CPU上
CR4-10 OSXMMEXCPT (Operating System Support for

Unmasked SIMD Floating-Point Exceptions)

操作系统使用,表示操作系统对奔腾III处理器引入的SIMD浮点异常(#XF)的支持。0表示操作系统不支持#XF异常,那么CPU会通过无效指令异常(#UD)来报告该异常,

以防止针对奔腾III以前处理器设计的操作系统在奔腾III或更新的CPU上运行时出错

 

发表评论