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