当我准备下周为学校进行装配/处理器架构考试时,我遇到了一些令人困惑的事情。
当执行二进制加法时,我们学习了大约4个条件标志:
N =结果为负
Z =结果为零
C =操作产生了一个进位
V =操作产生溢出
但是我很困惑,但是在发生溢出时是否必须设置N标志。
让我们在6 + 7的两个补码中考虑这个4位加法作为例子:
0110
0111+
-----
1101 = result
现在,当用2位补码计算4位时,这显然会导致溢出。它应该导致13(01101中的5位),但结果为-3,因为它只能以4位显示。 所以我的问题是,在这种情况下是否也设置了否定标志N?因为结果是负数。
答案 0 :(得分:2)
我无法确切地回答这个问题而不确切知道您正在使用哪个处理器,但通常将 N设置为等于结果的高(符号)位,独立于所有其他标志。因此,在您的示例中,将设置N和V.
(N,Z和C几乎总是来自ALU的位的简单函数 - C是来自加法器的进位,N等于结果的高位,而Z只是NOT (或(寄存器中的所有位))。它的V的定义最可能因处理器而异。)
答案 1 :(得分:1)
对于您的4位示例案例,请继续考虑以下示例:
否定,但没有溢出。
不是消极的,但已过度消耗。
这会显示负标志与溢出事实没有直接关系。
但是:通常没有解释的事情:溢出标志意味着符号错误,可以检测到真实结果符号作为负标志和溢出的XOR标志:
S = N xor V
其中S是真实标志(不直接出现在NZVC计划中)。此标志实际上用于分支操作:例如,当BGT的条件为((N xor V) or Z) == 0
时,这实际上意味着S or Z == 0
,或者换句话说,S == 0 and Z == 0
。
一些指令集架构,例如AVR
,有真正的标志标志,而不是负标志。