负条件标志N是否也设置为溢出?

时间:2017-01-28 16:52:47

标签: assembly cpu processor

当我准备下周为学校进行装配/处理器架构考试时,我遇到了一些令人困惑的事情。

当执行二进制加法时,我们学习了大约4个条件标志:

  

N =结果为负

     

Z =结果为零

     

C =操作产生了一个进位

     

V =操作产生溢出

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

让我们在6 + 7的两个补码中考虑这个4位加法作为例子:

0110
0111+
-----
1101  =  result

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

对于您的4位示例案例,请继续考虑以下示例:

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

否定,但没有溢出。

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

不是消极的,但已过度消耗。

这会显示负标志与溢出事实没有直接关系。

但是:通常没有解释的事情:溢出标志意味着符号错误,可以检测到真实结果符号作为负标志和溢出的XOR标志:

S = N xor V

其中S是真实标志(不直接出现在NZVC计划中)。此标志实际上用于分支操作:例如,当BGT的条件为((N xor V) or Z) == 0时,这实际上意味着S or Z == 0,或者换句话说,S == 0 and Z == 0

一些指令集架构,例如AVR,有真正的标志标志,而不是负标志。