学不完为什么还要执着呢?

说明

  32 位的 EFLAGS 寄存器包含一组状态标志、系统标志以及一个控制标志。在 x86 处理器初始化之后,EFLAGS 寄存器的状态值为 0000 0002H 第 1、3、5、15 以及 22 到 31 位均被保留 ,这个寄存器中的有些标志通过使用特殊的通用指令可以直接被修改,但并没有指令能够检查或者修改整个寄存器。通过使用 LAHF/SAHF/PUSHF/POPF/POPFD 等指令,可以将 EFLAGS 寄存器的标志位成组移到程序栈或 EAX 寄存器,或者从这些设施中将操作后的结果保存到 EFLAGS 寄存器中。在 EFLAGS 寄存器的内容被传送到栈或是 EAX 寄存器后,可以通过位操作指令(BT, BTS, BTR, BTC)检查或修改这些标志位。当调用中断或异常处理程序时,处理器将在程序栈上自动保存 EFLAGS 的状态值。 若在中断或异常处理时发生任务切换,那么 EFLAGS 寄存器的状态将被保存在 TSS 中 【the state of the EFLAGS register is saved in the TSS for the task being suspended.】 ,注意是将要被挂起的本次任务的状态。

32 位

标志含义
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
TF(Trap Flag)8陷阱标志,将该位设置为1以允许单步调试模式,清零则禁用该模式。
IF(Interrupt enable Flag)9中断标志,为 0 时禁止响应可屏蔽中断,为 1 时打开
DF(Direction Flag)10方向标志,为 1 时使字符串指令每次操作后
递减变址寄存器(ESI 或 EDI),为 0 时递增
OF(Overflow Flag)11溢出标志,结果超出机器的表达范围为 1,否则为 0
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 flag)21用于检测是否支持 CPUID 指令,如果能够成功设置
和清除该标志,则支持 CPUID 指令

64 位

  在 64 位模式下,RFLAGS 标志寄存器扩展到了 64 个比特位,但是最高 32 比特位全部是保留位。RFLAGS(64 位模式)与 EFLAGS(兼容模式)的系统标志位一致,没有增加。