【问题标题】:does NEG instruction in assembly language sets the Overflow flag汇编语言中的 NEG 指令是否设置了溢出标志
【发布时间】:2014-10-18 13:51:44
【问题描述】:

我想知道 NEG 指令是否也会影响溢出标志。我知道它会否定变量的值,但无法确定它是否会影响溢出标志。

【问题讨论】:

  • 你为什么不检查指令集参考而不是在这里询问并等待答案?
  • 我在那里看过,但真的很难从那里得到...只需要一到两行答案,我只是这个新手..
  • How does the NEG instruction set the adjust flag (AF) on x86? 还解释了neg x 根据0 - x 设置标志,就像sub 一样。

标签: assembly x86 masm32 eflags signed-overflow


【解决方案1】:

如果您想了解说明的作用,请参阅参考手册。

essential reference, namely the Intel instruction set manual 说明了 NEG 指令:

Flags Affected
The CF flag set to 0 if the source operand is 0; otherwise it is set to 1.
The OF, SF, ZF, AF, and PF flags are set according to the result. 

所以很明显,NEG 指令设置 O 标志;因此它影响 O 标志,这是 OP 的原始问题。每次执行时都会这样做。 (人们不应将“未更改”与“未设置”混淆)。

该特定参考手册未提供特定算法来指示 O 何时设置为零或一。但是,英特尔 CPU 是 2 的补码机器。减法指令具有完全相同的措辞。 NEG X 等价于 (0 SUBTRACT X)。所以NEG应该根据“溢出”为(0 SUBTRACT X)设置O位;这将在 X 为 0x8000000 时设置为 O。

检查Intel Basic Archiecture Manual,我们发现OF位的描述如下:

OF (bit 11) Overflow flag
— Set if the integer result is too large a positive number or too small a
  negative number (excluding the sign-bit) to fit in the destination operand;
  cleared otherwise. This flag indicates an overflow condition for signed-integer
 (two’s complement) arithmetic

确认我们的理解。

【讨论】:

    【解决方案2】:

    如果你neg80h的值,操作数没有变化,但溢出标志确实设置为1

    【讨论】:

    • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
    • @DaemonPainter 它确实提供了问题的答案。只是格式不太好。
    • @Scratte:它只是勉强提供了一个的答案; Ira 的回答已经给出了0x8000000 上的 neg 溢出(和设置 OF)的例子(使用 32 位操作数大小)。这个答案只是添加了产生的溢出值(未更改)并将操作数大小减小到 8 位操作数大小(没有提及大小;neg eax 与 eax=80h 将产生 0xffffff80 而不会溢出。)总的来说,我不认为这个答案需要删除,但我没有赞成,因为它的例子太少了:例如,你已经需要了解它才能知道它正在谈论的操作数大小。
    • @PeterCordes 这一切都非常合理。作为主题专家删除它始终是一种选择。通过仅用于验证“不是答案”标志的低质量帖子队列将其删除是完全不同的事情。该队列并不意味着提前获得 20K 特权。
    • @Scratte:对,同意,它确实回答了这个问题。它可以说是“低质量”,但不是“非常低质量”,因此标记删除原因都不是合理的。这不仅仅是 Ira 部分答案的复制/粘贴(这将证明删除是合理的),它只是唯一特殊情况的释义或独立陈述。
    猜你喜欢
    • 2011-04-24
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多