FLAGS 是标志寄存器,类似于 ARM 中的 ARM CPSR 寄存器,反映运行时的状态(status)。FLAGS 的命名方式和通用寄存器类似,在 16 位被称为 FLAGS
,在 32 位被称为 EFLAGS
,在 64 位被称为 RFLAGS
。
不过现在介绍的示意图往往是介绍 EFLAGS
。这是因为 FLAGS
内容和 32 位的 EFLAGS
的低 16 位相同,而 EFLAGS
的内容和 64 位的 RFLAGS
低 32 位相同,更有趣的是, RFLAGS
的高 32 位暂时保留(也就是还没用到)。其示意图如下:
其重要标志位记录如下:
位域 | 缩写 | 名称 | 描述 |
---|---|---|---|
0 | CF | Carry Flag | 进位标志,如果最近一次运算产生了进位或借位,则置位。 |
2 | PF | Parity Flag | 奇偶标志,如果最近一次运算结果的低 8 位包含偶数个 1,则置位。 |
6 | ZF | Zero Flag | 零标志,如果最近一次运算结果为 0,则置位。 |
7 | SF | Sign Flag | 符号标志,如果最近一次运算结果为负数,则置位。 |
8 | TF | Trap Flag | 陷阱标志,如果置位,处理器将进入单步调试模式。 |
9 | IF | Interrupt Enable Flag | 中断使能标志,如果置位,允许响应外部中断。 |
10 | DF | Direction Flag | 方向标志,控制字符串操作指令的方向。 |
11 | OF | Overflow Flag | 溢出标志,如果最近一次运算产生了溢出,则置位。 |
16 | RF | Resume Flag | 恢复标志,用于控制对调试断点的响应。 |
21 | ID | Identification Flag | 允许使用 CPUID 指令。 |
FLAGS 寄存器需要在中断处理等情景下被保存或者恢复,它并没有保存到特定的寄存器中(类似于 ARM 的 SPSR),而是保存到了栈上,对应的指令是 pushf
,当然这个指令适用于 16 位 flags ,而对于 32 位和 64 位,分别是 pushfd, pushfq
。