否定条件标志 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)而不是负标志。
当我准备下周的学校 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)而不是负标志。