学不完为什么还要执着呢?
说明
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(兼容模式)的系统标志位一致,没有增加。