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

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

软件调试——IA-32 保护模式下寄存器一览的更多相关文章

  1. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

  5. x86架构:保护模式下利用中断实现抢占式多任务运行

         站在用户角度考虑,一个合格的操作系统即使在单核下也能 "同时" 执行多个任务,这就要求CPU以非常快的频率在不同任务之间切换,让普通人根本感觉不到任务的切换.windwo ...

  6. x86架构:保护模式下加载并运行用户程序

    本章的代码分3个模块: MBR 引导:加载内核core程序 core:包含内核代码段(从磁盘加载用户程序并重定位).内核数据段(存放api名称.临时缓冲.字符串等).API段(供用户程序调用) 用户程 ...

  7. 为什么在保护模式下IA-32处理器最高可访问4GB的内存

    在保护模式下,IA-32处理器可访问最高达4GB的内存,这是32位无符号二进制整数地址能够寻址的上限.  今天看汇编的时候发现书里带过一句,不太明白为什么内存上限是4GB,就搜了一下,总结了一下答案. ...

  8. 保护模式下pmtest1.asm的理解

    整个代码对应内存线性地址分为四段,[gdt] [code32] [video32] [code16] 代码先在实模式[code16]下运行,code16中的cs就是系统分配的该程序物理地址的基址. 编 ...

  9. 有关80386cpu在保护模式下的虚拟地址,线性地址和实际物理地址的关系

    80386cpu是8086cpu的升级版,其具有32位的寄存器.(32根地址线和32根数据线) 8086cpu其是16位的寄存器但是其地址线有20根,其寻址范围为2的20次方,但是有一个16位的寄存器 ...

随机推荐

  1. UIView详解

    MVC架构模式   MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离).其中,M代表模型,就是程序中使用的数据和 ...

  2. 从头开始db-oracle

    rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpmrpm -ivh http: ...

  3. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  4. MYCAT 安装(转)

    1.安装JAVA环境JDK 基于JAVA开发,所以需要安装JDK 2.下载安装Mycat https://github.com/MyCATApache/Mycat-download 本次安装1.5版本 ...

  5. [2014.01.27]wfImage 图像处理组件 3.3

    组件支持多种图片格式,包括bmp,jpg,gif,wmf,emf,ico,png,pcx,tif,tga,pcx,dcx等. 组件提供两种输出接口,包括保存,直接显示(您再也不用定时清理那些临时的垃圾 ...

  6. js随机颜色生成

    return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);

  7. windows下IIS+PHP解决大文件上传500错问题

    linux下改到iis+php后,上传大于2M就出500错,改了php.ini中的upload_max_filesize也不行,最后解决如下: 第一步:修改php.ini 上传大小限制 (以上传500 ...

  8. NVMe over Fabrics:概念、应用和实现

    对于大部分人来说,NVMe over Fabrics(简称NVMf)还是个新东西,因为其第一个正式版本的协议在今年6月份才发布.但是这并不影响人们对NVMf的关注,因为这项依托于NVMe的技术很可能继 ...

  9. WCF部署于IIS使用的几个问题总结

    Q:wcf 远程服务器返回错误: (405) 不允许的方法. A: new SqlServerOperateClient("BasicHttpBinding_ISqlServerOperat ...

  10. flash flex 程序出现错误 Error #2032

    解决思路参考: http://www.cnblogs.com/enjoyprogram/archive/2012/06/21/2557615.html 有可能是这种情况: 状况:在安装flshbuil ...