这是我在 Intel x86-64 forneg
和许多其他指令的文档中看到的内容(包括sub
,因此将 FLAGS 理解neg x
为0 - x取决于此)。
根据结果设置OF、SF、ZF、AF和PF标志。
我假设sf = dest < 0
, zf = dest == 0
,但无法弄清楚其他标志是如何设置的。
我到处都看到这个“根据结果设置”短语,并希望您能帮助理解“相应地”设置标志的确切含义。
所以所有的标志都是根据执行的操作设置的,这就是短语“根据结果设置”的意思。
#3.4.3.1 状态标志 EFLAGS 寄存器的状态标志(位 0、2、4、6、7 和 11)指示算术指令的结果,例如 ADD、SUB、MUL 和 DIV 指令。状态标志功能是:
- CF(位 0)进位标志— 如果算术运算从结果的最高有效位产生进位或借位,则置位;否则清除。此标志指示无符号整数运算的溢出条件。它也用于多精度算术。
- PF (bit 2) Parity flag — 如果结果的最低有效字节包含偶数个 1,则设置;否则清除。
- AF(第 4 位)辅助进位标志— 如果算术运算从结果的第 3 位产生进位或借位,则置位;否则清除。此标志用于二进制编码的十进制 (BCD) 算术。
- ZF(位 6)零标志— 如果结果为零则置位;否则清除。
- SF(第 7 位)符号标志— 设置为等于结果的最高有效位,即有符号整数的符号位。(0 表示正值,1 表示负值。)
- OF(第 11 位)溢出标志— 如果整数结果是正数太大或负数太小(不包括符号位)而无法放入目标操作数,则设置;否则清除。该标志指示有符号整数(二进制补码)算术的溢出条件。
在这些状态标志中,只有 CF 标志可以使用 STC、CLC 和 CMC 指令直接修改。此外,位指令(BT、BTS、BTR 和 BTC)将指定位复制到 CF 标志中。
只有CF标志可以直接修改。其他的根据操作设置。