【问题标题】:What does "set according to the result" mean in Intel's SDM manuals?Intel SDM 手册中的“按结果设置”是什么意思?
【发布时间】:2016-11-08 03:20:34
【问题描述】:

这是我在 Intel x86-64 文档中看到的 neg 和许多其他指令(包括 sub,因此将 neg x 的 FLAGS 理解为 0 - x 取决于此)。

OFSFZFAFPF 标志根据结果​​设置。

我假设sf = dest < 0zf = dest == 0,但无法弄清楚其他标志是如何设置的。

我到处都看到这个“根据结果设置”短语,希望您能帮助理解“相应地”设置标志的确切含义。

【问题讨论】:

  • neg x 实现 0-x,一个完全正常的减法 (sub)。
  • 我从文档中知道 dest = -dest 用于 neg 指令,但我想知道如何修改标志。在许多情况下,文档将定义伪代码指令如何设置标志。在某些情况下,它会在“受影响的标志”部分列出未定义的标志。但是“相应设置”让我感到困惑,我真的很想知道它的含义。
  • 您的回答加上 David G 的回答解决了我的困惑。感谢您的帮助!
  • 我将此标记为新问题的副本,因为在此处接受的答案中,neg 如何设置 AF 的真正答案并不明确。

标签: assembly x86 x86-64 eflags


【解决方案1】:

所以所有的标志都是根据执行的操作设置的,这就是短语“根据结果设置”的意思。

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

  • CF (bit 0) 进位标志 — 如果算术运算从结果的最高有效位产生进位或借位,则置位;否则清除。此标志指示无符号整数运算的溢出条件。它也用于多精度算术。
  • PF (bit 2) Parity flag — 如果结果的最低有效字节包含偶数个 1 位,则设置; 否则清除。
  • AF(第 4 位)辅助进位标志 — 如果算术运算产生结果的第 3 位的进位或借位,则设置;否则清除。此标志用于二进制编码的十进制 (BCD) 算术。
  • ZF (bit 6) Zero flag — 如果结果为零则设置;否则清除。
  • SF (bit 7) Sign flag — 设置为等于结果的最高有效位,即有符号整数的符号位。 (0 表示正值,1 表示负值。)
  • OF(第 11 位)溢出标志 — 如果整数结果是正数太大或负数太小(不包括符号位)而无法容纳在目标操作数中;否则清除。此标志指示有符号整数(二进制补码)算术的溢出条件。

在这些状态标志中,只有 CF 标志可以使用 STC、CLC 和 CMC 指令直接修改。位指令(BT、BTS、BTR 和 BTC)也将指定位复制到 CF 标志中。

只有CF标志可以直接修改。其他的根据操作设置。

Source - Intel

【讨论】:

  • 找到了。我在文档中的“描述”中忽略了它。这就是说的,以防将来有人偶然发现这个问题。 "将操作数(目标操作数)的值替换为其二进制补码。(此操作相当于将操作数从 0 中减去。)"
  • 我唯一确定的是标志是在执行操作后由 CPU 设置的。对于第 7.3.2.4 节的 NEG - NEG(否定)指令从零中减去一个有符号整数操作数。同一节讨论 CMP 及其更新的标志。我不能告诉你的是它是一个特定的加法器还是 ALU 的一部分,因为这超出了我的深度。
  • 请注意,您可以使用popf/popfd/popfq 指令完全修改eflags 寄存器中的内容,除了IF 中断启用,我相信。
  • 所有标志都可以直接用popflahf指令修改。
  • 确实POPFSAHF(不是LAHF!)以及其他可以修改标志(例如,SAHF 写入CF,@987654331 @,AF,ZF,SF 但不是OF)。 *FLAGS 寄存器中还有其他标志可能会或可能不会根据许多因素进行修改,但这超出了此问题的范围。 (虽然它比处理IF 更复杂——有关详细信息,请参阅POPF 的文档)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多