通用寄存器
8个通用寄存器,分别是:EAX、EBX、ECX、EDX、EBP、ESP、EDI、ESI,其中,低16为又可以组成8个16位的寄存器。另外,AX、BX、CX、DX,每个又可以细分为两个8位的寄存器。
在64位系统中,分别叫做RAX、RBX、RCX、RDX、RBP、RSP、RSI、RDI。
段寄存器
8086有6个16位的段寄存器:CS、DS、SS、ES、FS、GS。
- CS:代码段寄存器,指向包含程序指令的段
- DS:数据段寄存器,指向包含静态数据或全局数据的段
- SS:栈段寄存器,指向包含当前程序栈的段
- ES、FS、GS:一般用途,可以指向任何段
16位的段寄存器不能保存32位的段基地址,所以,需要增加段描述符(8字节),在段描述符中,分出4字节作为段基地址。而段寄存器只用来保存段选择符,段选择符用于定位段描述符表中的表项。
段选择符结构
16位长段选择符结构如下:
指令指针寄存器和标志寄存器
- EIP: 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址(相对于段寄存器CS的偏移量),CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复。EIP中低16位可以单独访问,叫做IP,用于16位寻址。在 x64 架构下,32位的 EIP 升级为64位的 RIP寄存器。
- EFLAGS: 标志寄存器,存放处理器标志位。
标志位 |
名称 |
说明 |
CF |
Carry Flag |
无符号数溢出(如 `ADD` 后进位)。算术操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。这个标志指示无符号整型运算的溢出状态,这个标志同样在多倍精度运算(multiple-precision arithmetic)中使用。 |
PF |
Parity Flag |
奇偶校验(最低字节中 1 的个数是否为偶数)。如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。 |
AF |
Adjust Flag |
辅助进位标记。如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。这个标志在BCD(binary-code decimal)算术运算中被使用 |
ZF |
Zero Flag |
结果为零(`CMP` 后判断相等性) |
SF |
Sign Flag |
结果为负数(最高位为 1)。该标志被设置为有符号整型的最高有效位。(0指示结果为正,反之则为负) |
OF |
Overflow Flag |
有符号数溢出(如 `ADD` 后符号异常)。如果整型结果是较大的正数或较小的负数,并且无法匹配目的操作数时将该位置1,反之清零。这个标志为带符号整型运算指示溢出状态。 |
DF |
Direction Flag |
字符串操作方向。这个方向标志(位于EFLAGS寄存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。STD以及CLD指令分别用于设置以及清除DF标志。 |
IF |
Interrupt Flag |
控制是否响应可屏蔽中断(`CLI` 禁用)。该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。 |
TF |
Trap Flag |
单步调试(触发 `INT 1` 异常)。将该位设置为1以允许单步调试模式,清零则禁用该模式。 |
IOPL |
I/O Privilege Level |
指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。这个域只能在CPL为0时才能通过POPF以及IRET指令修改。 |
NT |
Nested Task |
这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。 |
RF |
Resume Flag |
控制处理器对调试异常的响应 |
VM |
Virtual-8086 Mode |
置1以允许虚拟8086模式,清除则返回保护模式。 |
AC |
Alignment Check |
该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。 |
VIF |
Virtual Interrupt Flag |
该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions) |
VIP |
Virtual Interrupt Pending |
该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。【Software sets and clears this flag; the processor only reads it.】与VIF标志结合使用。 |
ID |
ID Flag |
程序能够设置或清除这个标志指示了处理器对CPUID指令的支持。 |
控制寄存器
CR0、CR1、CR2、CR3共四个控制寄存器。
CR0
标志位 |
说明 |
PE |
保护(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。 |
MP |
数学存在位 |
EM |
仿真位 |
TS |
任务切换位.(Task Switched)标志。该标志用于推迟保存任务切换时的协处理器内容,直到新任务开始实际执行协处理器指令。处理器在每次任务切换时都会设置该标志,并且在执行协处理器指令时测试该标志 |
ET |
Extension Type.当该标志为1时,表示指明系统中有80387协处理器,并使用32位协处理器协议。ET=0指明使用80287协处理器 |
NE |
协处理器错误(Numeric Error)标志。当设置该标志时,就启用了x87协处理器错误的内部报告机制;若复位该标志,那么就使用PC形式的x87协处理器错误报告机制。 |
WP |
对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。 |
AM |
对齐掩码(Alignment Mask),该位用于控制内存对齐检查。
|
NW |
不直写(Not Write-through),该位用于控制写缓冲的写策略。
|
CD |
缓存禁用(Cache Disable),该位用于控制处理器的缓存。
|
PG |
CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制;当复位时则禁止分页机制,此时所有线性地址等同于物理地址 |
CR1
CR2
CR2是页故障线性地址寄存器,保存最后一次出现页故障(Page Fault)的全 32(或 64) 位线性地址。
CR3
标志位 |
说明 |
PWT |
页级写穿标志位(Page-Level Write-Through),用于指定页表是否应用写穿策略。 |
PCD |
页级高速缓存禁用标志位(Page-Level Cache Disable),用于指定页表是否应用高速缓存禁用策略。 |
CR4
VME:允许使用虚拟 8086 模式扩展。
PVI:保护模式虚拟中断。
TSD:禁用处理器在启动过程中使用时间戳计数器。
DE:允许调试扩展。
PSE:启用超级页(2MB页)
PAE:启用物理地址扩展,支持大于4GB的物理内存。
当 PAE = 1 时,是 2-9-9-12 分页。
当 PAE = 0 时, 是 10-10-12 分页。
MCE:启用机器检查异常。
PGE:启用全局页表。
PCE:启用性能监控计数器。
OSFXSR:允许操作系统使用 FXSAVE 和 FXRSTOR 指令进行 XMM 寄存器的保存和恢复。
OSXMMEXCPT:允许操作系统使用 SSE 指令集的浮点异常。
UMIP:防止用户模式下执行特权指令。
VMXE:启用虚拟机扩展。
SMXE:启用安全模式扩展。
FSGSBASE:启用 FS、GS 寄存器的基址存储。
PCIDE:启用 PCID(Process Context Identifier)。
OSXSAVE:启用 XSAVE 和 XRSTOR 指令。
SMEP:启用用户模式执行保护。
SMAP:启用内核空间和用户空间地址映射的严格分离。
总结
x86 寄存器系统通过分工协作实现高效计算与控制:通用寄存器处理数据操作,段寄存器管理内存分区,EFLAGS 跟踪状态,控制寄存器管理 CPU 模式。理解其设计对操作系统开发、逆向工程和性能优化至关重要。在 64 位模式下,寄存器扩展和新增的 R8-R15 进一步提升了复杂应用的效率。