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