assembly 在x86/x64中设置EFLAGS标志的条件[重复]

ktca8awb  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(181)
    • 此问题在此处已有答案**:

how often does FLAGS register get updated in asm?(1个答案)
十小时前关门了。
我想知道基本EFLAGS标志在什么条件下(CF,ZF,OF,SF ...)都设置好了。我已经看了Intel的x86指令手册,和this website,做得很好,但没有成功。我设法找到了条件跳转的条件(例如,如果(SF!= OF)或(ZF == 1),则采用JLE),但不考虑标志本身。
关于ZF,它是最简单的一个,因为它只需要检查结果是否为零。对于SF,我假设必须检查结果的最高有效位是零还是一。但是对于其他的,我不确定。另外,这些条件在所有x86指令中操作这些标志时是否相同,或者ADD和CMP是否会在不同的公式下设置它们的标志?

ctehm74n

ctehm74n1#

intel SDM回答了您在第1卷-3.4.3 EFLAGS寄存器中提出的问题。
部分引用文件:
3.4.3.1 Status Flags
EFLAGS寄存器的状态标志(位0、2、4、6、7及11)表示算术指令(如ADD、SUB、MUL及DIV指令)的结果。状态标志的功能包括:

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

[...]
这并不是您能找到的关于这个主题的最深入的源代码,因为它没有涵盖各种x86实现的勘误表(而且有很多这样的实现...),但它肯定是您入门的最佳源代码。
快乐黑客;)

相关问题