image.png

通用寄存器

寄存器类型 80386 /32位 说明




数据寄存器 EAX 累加器
Accumulator
扩展累加寄存器(在乘/除法中被自动调用)Accumulator
常用作函数的返回值
EBX 基址
Base
基址寄存器,DS 段中的数据指针。
ECX 计数
Count
常用作 循环计数器,在字符串和循环操作中常用,
在循环指令(LOOP)或串操作中,ECX 用来进行循环计数,每执行一次循环,ECX 都会被CPU 自动减一。
thiscall 用来保存this指针传参
EDX 数据
Data
常用作 是数据寄存器,用来存放8字长的高32位
指针寄存器 ESP 堆栈指针寄存器
Extend Stack Pointer
SS 段中堆栈指针,专用指向堆栈 栈顶指针,ESP 用来寻址堆栈上的数据
EBP 基址指针寄存器
Extend Base Pointer
SS 段中堆栈内数据指针,指向最上面一个栈帧的栈顶的底部,表示数据在堆栈段中的基地址
变址寄存器 ESI 源变址
Extend Source
扩展源指针(由高速内存数据传送指令使用),字符串操作源指针
EDI 目的变址
Extend Destination Index
扩展目的指针(由高速内存数据传送指令使用),字符串操作目标指针

指令指针寄存器

寄存器类型 80386 /32位 说明
指令指针寄存器 EIP Extend Instruction Pointer 指令寄存器EIP是对8086/80286指令指针寄存器的32位扩展,它包含着待执行指令的32位偏移量,该值总是相对CS所代表的段基址而言的。
指令指针(总是指向下一条要执行的指令地址),不做他用;
计算机通过CS:IP寄存器来控制指令序列的执行流程;
IP寄存器是一个专用寄存器,不能直接赋值修改;
IP 它与代码段寄存器 CS联用,永远存储着即将执行的指令的地址,每执行完一条指令,CPU都会根据CS:IP找到下一条指令,同时IP被赋值为再下一条指令的地址

标志寄存器

寄存器类型 80386 /32位 说明




标志状态 OF 溢出标志
Overflow Flag
当我们讨论溢出时,讨论的是有符号数;
若算数运算的结果有溢出,则OF置1
主要针对有符号:以8位数为例,8位的范围是(-128~+127)如果运算结果超出这个范围,就产生了溢出,有溢出,说明有符号数 的运算结果不正确。
CF 进位标志
Carry Flag
当我们讨论进位时,讨论的是无符号数;
当运算结果的最高有效位有进位(加法)或借位(减法)是,进位标志位置1;
主要针对无符号(无符号位):8位计算 进位作为临时第九位使用;8位存不下,就进位
ZF 零标志
Zero Flag
ZF=1:运算结果为0
ZF=0:运算结果不为0
SF 符号标志
Sign Flag
运算结果最高位为1,则SF=1,否则SF=0
有符号数据用最高位表示符号,所以最高有效位就是符号标志的状态
AF 辅助进位标志
Auxiliary Carry Flag
运算时低半字节由进位或借位时,AF=1
PF 奇偶标志
Parity Flag
当运算结果最低8位中1的个数是偶数或0时 PF=1
控制标志 IF 中断标志
Interrupt-enable Flag
用于控制i外部可屏蔽中断是否可以被处理器响应
IF=1 允许中断;IF=0 禁止中断
TF 陷阱标志
Trap Flag
TF=1:用于调试单步操作
TF=0:处理正常工作
DF 方向标志
Direction Flag
1.用于串操作指令,控制地址ide变化方向;
CLD Clear Direction 用于复位方向标志 执行后 DF=1

段寄存器

寄存器类型 80386 /32位 说明
段寄存器 CS 代码段
Code Segment
存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。
SS 堆栈段
Stack Segment
指出当前堆栈的底部地址,即存放堆栈段的段基址。
DS 数据段
Data Segment
指明数据段的起始地址
ES 附加段
Extra Segment
指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。
FS 辅助段
80386 新增
FS寄存器指向当前活动线程的TEB结构
FS:[0x30] 指向PEB结构
相关资料:https://bbs.pediy.com/thread-159935.htm
GS 辅助段
80386 新增

系统表寄存器

寄存器类型 80386 /32位 说明
系统表寄存器 GDTR 全局描述符表寄存器
Global Descriptor Table Register
保存GDT的地址,在Windbg 可“r gdtr”查看GDT的地址
LDTR 局部描述符表寄存器
Local Descriptor Table Register
保存LDT的地址
IDTR 中断描述符表寄存器
Interrupt Descriptor Table Register
保存IDT的地址 在Windbg 可“r idtr”查看GDT的地址
TR 任务状态寄存器
Task-State Register
TSS 资料:https://blog.csdn.net/chen1540524015/article/details/74075252

控制寄存器

寄存器类型 80386 /32位 说明
控制寄存器 CR0 CR0中各位含义如下:
PE(Protection Enable)保护模式允许,PE=0表示CPU工作在实模式,PE=1表示CPU工作在保护模式
MP(Monitor Coprocessor)监控协处理器,MP=1表示协处理器在工作,MP=0表示协处理器未工作。
EM(Emulation)协处理器仿真,当MP=0,EM=1时,表示正在使用软件仿真协处理器工作。
TS(Task Switched)任务转换,每当进行任务转换时,TS=1,任务转换完毕,TS=0。TS=1时不允许协处理器工作。 以上 4个定义从80286开始,下面的2个定义从80386开始存在
ET(Extension Type)处理器扩展类型,反映了所扩展的协处理器的类型,ET=0为80287,ET=1为80387。
PG(Paging)页式管理机制使能,PG=1时页式管理机制工作,否则不工作。

从80486开始又增加了如下位定义。
NE(Numeric Error)数值异常中断控制,NE=1时,如果运行协处理器指令发生故障,则用异常中断处理,NE=0时,则用外部中断处理。
WP(Write Protect)写保护,当WP=1时,对只读页面进行写操作会产生页故障。
AM(Alignment Mask)对齐标志,AM=1时,允许对齐检查,AM=0时不允许,关于对齐,在EFLAGS的AC标志时介绍过,在80486以后的CPU中,CPU进行对齐检查需要满足三个条件,AC=1、AM=1并且当前特权级为3。
NW(Not Write-through)和CD(Cache Disable),这两个标志都是用来控制CPU内部的CACHE的,当NW=0且CD=0时,CACHE使能,其它的组合说起来比较复杂,如果有读者真的想搞清楚的话,可以参阅《Intel? 64 and IA-32 Architectures》中的“Software Developer’s Manual Volume 3A”这一册,在第10章对这两个标志的各种组合有比较详细的说明。
CR1 保留
CR2 CR2存放引起缺页异常的线性地址,只有在PG=1时,CR2才有效,当页故障处理程序被激活时,压入页故障处理程序堆栈中的错误码提供页故障的状态信息。
CR3 保存 页目录表的基址(DirBase
CR4 CR4是从Pentium CPU开始出现的。

VME(Virtual-8086 Mode Extensions)虚拟8086方式扩展,VME=1允许使用虚拟8086扩展模式,否则只能使用80386/80486的虚拟8086模式。
PVI(Protected-Mode Virtual Interrupts)保护模式虚拟中断,PVI=1时,在保护模式下支持虚拟中断标志VIF(EFLAGS中),PVI=0则不支持虚拟中断标志。
TSD(Time Stamp Disable)时间戳禁止,TSD=1时,允许在特权级为0的程序中执行RDTSC指令(读时间戳计数指令),TSD=0时,允许任何特权级执行RDTSC指令。
DE(Debugging Extensions)调试扩展,
PSE(Page Size Extensions)页大小扩展,PSE=1时,页大小可以扩展到2M或4M,PSE=0时,页大小只能是4K.
PAE(Physical Address Extension)物理地址扩展,PAE=1时,页物理地址可以扩展到36bits以上,PAE=0时只能用32bits的物理地址。
MCE(Machine-Check Enable)硬件检查使能,Pentium以后的CPU有一种硬件检测功能,MCE=1时允许使用该功能。
PGE(Page Global Enable)全局页使能,PGE=1时,允许使用全局页,PGE=0时禁止使用全局页。
PCE(Performance-Monitoring Counter Enable)性能监视计数器使能,当PCE=1时,允许在任何保护级下执行RDPMC指令,PCE=0时,只有特权级0的程序可以执行RDPMC指令。
OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions)
OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions)
VMXE(VMX-Enable Bit)VMX使能位,VMXE=1时,允许VMX操作。
SMXE(SMX-Enable Bit)SMX使能位,SMXE=1时,允许SMX操作。
OSXSAVE(XSAVE and Processor Extended States-Enable Bit) |

调试寄存器

寄存器类型 80386 /32位 说明
调试寄存器
80386新增
DR0~DR3 分别设置4个硬件断点的线性地址
DR4~DR5 保留
DR6 断点状态寄存器
DR7 断点控制寄存器(包括断点类型、断点长度,断点开放/禁止)

测试寄存器

寄存器类型 80386 /32位 说明
测试寄存器
80386新增
TR0~TR2 保留
TR3~TR5 用作CACHE测试
TR6 命令测试寄存器
TR7 测试数据寄存器

特殊模块寄存器

寄存器类型 80386 /32位 说明
特殊模块寄存器
Model Specific Register
MSR 性能监视计数 MSR寄存器的雏形开始于Intel 80386和80486处理器,到Intel Pentium处理器的时候,Intel就正式引入RDMSR和WRMSR两个指令用于读和写MSR寄存器,每个MSR寄存器都会有一个相应的ID,即MSR Index,或者也叫作MSR寄存器地址,当执行RDMSR或者WRMSR指令的时候,只要提供MSR Index就能让CPU知道目标MSR寄存器。这些MSR寄存器的编号(MSR Index)、名字及其各个数据区域的定义可以在Intel x86架构手册”Intel 64 and IA-32 Architectures Software Developer’s Manual”的Volume 4中找到。
调试扩展支持
机器检查
功耗与温控管理
特殊执行的支持 WRMSR 特权写命令 ecx存放序号,执行完后数据放置在eax中
处理器特性和处理器模式支持 RDMER特权读命令 eax存放数据,ecx存放序号,执行后eax 写入到相应寄存器

访问存储器的方式