EFLAGS 寄存器¶
与高级代码不同,汇编语言没有 ==、> 和 < 这样的二进制比较操作符。相反,它用 CMP 命令比较两个值,把结果信息存储在 EFLAGS 寄存器中。然后代码用特殊操作改变控制流,这些操作取决于 ELFAGS 中存储的值。
虽然比较命令是唯一能访问 EFLAGS 的用户模式操作,但它们只使用这个寄存器的状态位:0、2、4、6、7 和 11。位 8–10 充当控制标志,位 12–14 和 16–21 充当系统标志,其余位留给处理器。表 4-5 显示了每个 EFLAGS 位的类型、名称和描述。
位类型名称描述状态进位 Carry如果上一条指令从最高有效位生成了进位或借位,则置位。状态奇偶 Parity如果上一条指令产生的最低有效字节有偶数个位被置位,则置位。状态调整 Adjust与进位标志相同,但考虑 4 个最低有效位。状态零 Zero如果上一条指令的结果值等于 0,则置位。状态符号 Sign如果上一条指令的结果值设置了符号位(最高有效位),则置位。控制陷阱 Trap置位时,处理器在执行下一个操作后向操作系统内核发送中断。控制中断 Interrupt未置位时,系统忽略可屏蔽中断。位类型名称描述控制方向 Direction置位时,自动修改 ESI 和 EDI 的操作会递减它们。未置位时,递增。状态溢出 Overflow当上一条指令使值溢出时置位,例如对正值执行 ADD 而结果是负值。
EFLAGS 寄存器还包含一个系统位和一个保留位,但它们在用户模式汇编和游戏破解中无关紧要,所以我把它们从表中省略了。调试游戏代码时记住 EFLAGS,弄清楚它是如何工作的。例如,如果你在 JE(相等则跳转)指令上设置断点,你可以查看 EFLAGS 的第 0 位,看跳转是否会发生。