【问题标题】:Is the Negative condition flag N also set with an Overflow?负条件标志 N 是否也设置了溢出?
【发布时间】:2017-01-28 16:52:46
【问题描述】:

当我准备下周学校的汇编/处理器架构考试时,我遇到了一些相当令人困惑的事情。

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

N = 结果是否定的

Z = 结果为零

C = 操作产生进位

V = 操作产生的溢出

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

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

0110
0111+
-----
1101  =  result

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

【问题讨论】:

  • 是的,已经设置好了。 N 标志只是最高有效位的副本。当然也可以设置不溢出。

标签: assembly cpu processor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    负数,但没有溢出。

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

    不是负面的,而是溢出的。

    这将向您表明否定标志与溢出事实没有直接关系。

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

    S = N xor V
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2011-03-09
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多