否定条件标志 N 是否也设置了溢出?

Is the Negative condition flag N also set with an Overflow?

当我准备下周的学校 assembly/processor 建筑考试时,我遇到了一些相当令人困惑的事情。

执行二进制加法时,我们了解了 4 个条件标志:

N = result is negative

Z = result is zero

C = operation produced a carry

V = operation produced overflow

但是我很困惑是否必须在溢出时设置 N 标志。

我们以 6+7 的二进制补码中的这个 4 位加法为例:

0110
0111+
-----
1101  =  result

现在,当用二进制补码计算 4 位时,这显然会导致溢出。它的结果应该是 13(5 位的 01101),但结果是 -3,因为它只能以 4 位显示。 所以我的问题是,在这种情况下是否也设置了 Negative 标志?因为结果是负数。

如果不知道您使用的是哪种处理器,我无法肯定地回答这个问题,但是通常 N 设置为等于结果的高(符号)位, 独立于所有其他标志。因此,在您的示例中,N 和 V 都将被设置。

(N、Z 和 C 几乎总是来自 ALU 的位的简单函数 - C 是来自加法器的 carry-out,N 等于结果的高位,并且Z 只是 NOT(或(寄存器中的所有位))。它是 V,其定义最有可能因处理器而异。)

根据您的 4 位示例案例,继续考虑以下示例:

  • 0001 + 1110 == 1111(十进制:1 + (-2) == -1)

负数,但没有溢出。

  • 1100 + 1001 == 0101(十进制:(-4) + (-7) == 5;-11 不会溢出)

不是负面的,但溢出了。

这会告诉你负标志与溢出事实没有直接关系。

但是:通常没有解释的事情:一旦溢出标志意味着符号错误,就可以检测真正的结果符号作为负标志和溢出标志的异或:

S = N xor V

其中 S 是 真符号标志(不直接出现在 NZVC 方案中)。该标志实际上用于分支操作:例如,当 BGT (PDP-11/ARM/etc.name) == JG (x86 name) 的条件为 ((N xor V) or Z) == 0 时,这实际上意味着 S or Z == 0,或者,换句话说,S == 0 and Z == 0.

另外,这也可以写成:

N = S xor V

和:

V = N xor S

(后者最接近V标志的形式定义)

一些指令集架构,例如AVR,在条件标志寄存器(N)中有真标志标志(S)而不是负标志。