x86 寄存器与 EFLAGS 标志位全解析:从模式到标志含义

寄存器

实模式和保护模式

实模式:CPU工作在16位的地址总线和数据总线上,并且没有内存保护、多任务处理、虚拟内存的支持。实模式提供了直接访问物理内存的简单操作环境。

保护模式:32 位系统中,段的主要作用不再是寻址,而是施加保护,此外引入了新的分页内存的机制,这些称作保护模式。

通用寄存器

十六位通用寄存器。

ax、bx、cx、dx、sp、bp、si、di(共8个)

三十二位通用寄存器扩展(Extend)到32位。

EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP(共8个)

六十四位通用寄存器,其中 R 是个前缀,表示 Register(寄存器)本身。

RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP

R8、R9、R10、R11、R12、R13、R14、R15(共16个)

注意:同名寄存器之间并不是许多个相互独立的寄存器,而是共同属于一个寄存器。

AX、BX、CX、DX 有 H 和 L 之分,例如:AL,AH,BL,BH,CL,CH,DL,DH。

以 RAX 为例,RAX 是个 64 位寄存器,EAX 指的是 RAX 的低 32 位,AX 指的是 RAX 的 0-15 位,AH 指的是 RAX 的 8-15位,AL 指的是 RAX 的 0-7 位。

段寄存器

CS、DS、ES、FS、GS、SS(6个段寄存器)

标志寄存器

状态标志,控制标志,系统标志

标志寄存器在32位模式中叫做 EFLAGS,在64位模式叫做 RFLAGS。RFLAGS 高32位保留,低32位与 EFLAGS 相同。

指令指针寄存器

指令指针寄存器存储的是 CPU 即将执行的下一条指令的地址。

通常用 IP / EIP / RIP 代表(16、32、64 位)。

EFLAGS 寄存器的各个位和标志位含义:

EFLAGS 寄存器的各个位和标志位含义图示

EFLAGS 寄存器标志位:

  • CF (Carry Flag):进/借位标志位。用于表示某些算术操作或移位操作是否产生了进位或借位。

  • PF (Parity Flag):奇偶标志位。用于表示结果中 1 的个数的奇偶性。

  • AF (Auxiliary Carry Flag):辅助进位标志位。用于表示低 4 位的进位或借位情况。

  • ZF (Zero Flag):零标志位。用于表示操作结果是否为零。

  • SF (Sign Flag):符号标志位。用于表示操作结果的最高有效位(符号位)。

  • TF (Trap Flag):陷阱标志位。用于控制单步执行调试功能。

  • IF (Interrupt Flag):中断标志位。用于控制是否允许中断响应。

  • DF (Direction Flag):方向标志位。用于控制字符串传输指令的方向(正向或反向)。

  • OF (Overflow Flag):溢出标志位。用于表示有符号算术操作是否发生溢出。

  • IOPL (I/O Privilege Level):I/O 特权级。用于管理对 I/O 端口的访问权限。

  • NT (Nested Task Flag):嵌套任务标志位。用于表示当前是否处于嵌套任务的执行环境。

  • RF (Resume Flag):恢复标志位。用于控制中断返回时是否进入恢复处理器状态的过程。

  • VM (Virtual Mode Flag):虚拟模式标志位。用于指示处理器是否处于虚拟模式。

  • AC (Alignment Check):对齐检查标志位。用于控制是否进行内存对齐检查。

  • VIF (Virtual Interrupt Flag):虚拟中断标志位。用于指示当前是否处于虚拟 8086 模式的中断响应中。

  • VIP (Virtual Interrupt Pending):虚拟中断等待标志位。用于指示是否有虚拟中断正在等待响应。

  • ID (ID Flag):识别标志位。用于指示是否支持 CPUID 指令。

一般只需要关注下面9个标志位:

  1. CF 进位标志:当算术结果产生进位或者借位的时候被置1
  2. PF 奇偶标志:当算术结果为偶数时被置1
  3. AF 辅助进位标志:算术操作在结果的第三位发生进位或借位则将该标志置1
  4. ZF 零标志:当结果为0时被置1
  5. SF 符号标志:当算术结果为负数时被置1
  6. TF 单步标志 :和调试原理相关
  7. IF 中断标志:和内核有关系
  8. DF 方向标志:会影响MOVS STOS两个串操作指令中EDI和ESI的值
  9. OF 溢出标志:当有符号数的数值超过最大范围时被置 1