FLAGS 是标志寄存器,类似于 ARM 中的 ARM CPSR 寄存器,反映运行时的状态(status)。FLAGS 的命名方式和通用寄存器类似,在 16 位被称为 FLAGS ,在 32 位被称为 EFLAGS ,在 64 位被称为 RFLAGS 。

不过现在介绍的示意图往往是介绍 EFLAGS 。这是因为 FLAGS 内容和 32 位的 EFLAGS 的低 16 位相同,而 EFLAGS 的内容和 64 位的 RFLAGS 低 32 位相同,更有趣的是, RFLAGS 的高 32 位暂时保留(也就是还没用到)。其示意图如下:

其重要标志位记录如下:

位域缩写名称描述
0CFCarry Flag进位标志,如果最近一次运算产生了进位或借位,则置位。
2PFParity Flag奇偶标志,如果最近一次运算结果的低 8 位包含偶数个 1,则置位。
6ZFZero Flag零标志,如果最近一次运算结果为 0,则置位。
7SFSign Flag符号标志,如果最近一次运算结果为负数,则置位。
8TFTrap Flag陷阱标志,如果置位,处理器将进入单步调试模式。
9IFInterrupt Enable Flag中断使能标志,如果置位,允许响应外部中断。
10DFDirection Flag方向标志,控制字符串操作指令的方向。
11OFOverflow Flag溢出标志,如果最近一次运算产生了溢出,则置位。
16RFResume Flag恢复标志,用于控制对调试断点的响应。
21IDIdentification Flag允许使用 CPUID 指令。

FLAGS 寄存器需要在中断处理等情景下被保存或者恢复,它并没有保存到特定的寄存器中(类似于 ARM 的 SPSR),而是保存到了栈上,对应的指令是 pushf ,当然这个指令适用于 16 位 flags ,而对于 32 位和 64 位,分别是 pushfd, pushfq 。