软件调试——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上运行时出错

5 段寄存器

CS代码段,DS数据段,SS堆栈段,ES扩展段,FS标志段, GS全局段,都是16位的数

实模式下:该值就是段地址,将该值左移4位(或乘以16),直接得到该段的基地址,实模式下基地址就是物理地址。

保护模式下:将段地址的值拆成16位

0~1位 2位 3~15位
RPL TI Index 
特权级0~3,目前就只有0和3两个值 段选择子,0表示GDT,1表示LDT 在GDT或LDT表中的索引,可表示1~8191,0位置为null不会被使用

GDTR:全局描述符表寄存器,保存着GDT的位置和边界,在保护模式下有效,一个操作系统只有一个GDT表,使用LGDT指令读取,SGDT设置

LDTR:局部描述符表寄存器,保存着LDT的位置和边界,在保护模式下有效,一个任务对应一个LDT表,也可以多个任务共享一个LDT表

IDTR:中断描述符寄存器,保存着IDT的位置和边界,在保护模式下有效,一个CPU核心有一个IDT表,读写指令为LIDT和SIDT

6 程序指针寄存器EIP

EIP(Extended Instruction Pointer),指向CPU要执行的下一条指令,其值为该指令在当前代码段中的偏移地址

这个寄存器非常重要,一般函数调用时会将当前执行指令的下一个指令的地址(就是当前的EIP)压栈,这样函数调用结束后,从栈中取出来EIP可调回到上一级函数继续执行

7 其他寄存器

(1)向量运算寄存器XMM0~XMM7,供SSE/SSE2/SSE3指令使用以支持对单精度浮点数进行SIMD计算

(2)ST0~ST7(每个寄存器都占用80个位),供FPU和MMX使用的寄存器,当执行MMX指令时,其中低64位用于MMX数据寄存器MM0~MM7;当执行x87浮点运算指令时,它们被用作浮点数据寄存器R0~R7

(3)任务寄存器TR,用于存放选取任务状态段(Task State Segment,简称TSS)描述符的选择子,TSS用来存放一个任务的状态信息,在多任务环境下,CPU在从一个任务切换到另一个任务时,前一个任务的寄存器等状态被保存到TSS中

(4)时间戳计数器TSC(Time Stamp Counter,64位),每个时钟周期自增1,重启时清0,RDTSC指令读取TSC寄存器,Ring3想要使用该指令,需要先将CR4的TSD位置0

(5)内存类型范围寄存器MTRR(Memory Type and Range Register),定义了内存空间中各个区域的内存类型,CPU据此知道响应内存区域的特征,比如是否可以对其做高速缓存等

(6)调试寄存器DR0~DR7

上一篇:学习linux内核时常碰到的汇编指令(1)


下一篇:汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY