通用寄存器
寄存器类型 | 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 写入到相应寄存器 |
访问存储器的方式