在x86/x64中设置EFLAGS标志的条件



我想知道基本EFLAGS标志(CF, ZF, OF, SF…)设置的条件是什么。我查阅了Intel x86的使用说明书,这个网站认为做得很好,但是没有成功。我设法找到了条件跳转的条件(例如,如果(SF != OF)或(ZF == 1),则采用JLE),但没有考虑到标志本身。

关于ZF,它是最简单的,因为它只需要检查结果是否为零。对于SF,我假设必须检查结果的最高有效位是0还是1。但对于其他人,我不确定。此外,这些条件在操纵这些标志的所有x86指令中是相同的吗?或者ADD和CMP会在不同的方程下设置它们的标志吗?

intel SDM确实回答了您关于卷1 - 3.4.3 EFLAGS寄存器的问题。

部分引用文档:

3.4.3.1状态标志

EFLAGS寄存器的状态标志(0、2、4、6、7和11位)表示算术指令的结果。例如ADD、SUB、MUL和DIV指令。状态标志函数有:

  • CF (bit 0)进位标志-当算术运算产生进位或最多位外移时设置结果的有效位;清除。的溢出条件无符号整数算术。它也用于多精度运算。
  • PF (bit 2)奇偶校验标志-如果结果的最低有效字节包含偶数个1位,则设置;否则。
  • AF(位4)辅助进位标志-当算术运算产生进位或外借位时设置3 .结果;清除。此标志用于二进制编码的十进制(BCD)算术。
  • ZF (bit 6)零标志-当结果为零时设置;否则。

[…]

这不是你能找到的关于这个主题的最深入的来源,因为它不包括各种x86实现的勘误表(有很多……),但它肯定是让你开始的最好的。

快乐破解;)

最新更新