ARM处理器中的溢出标志是如何组合在一起的?

时间:2013-11-18 18:46:51

标签: arm overflow

如何创建ARM处理器中的V(溢出)标志?是进位XOR最高(31.Bit)=负位? C XOR N ??或者是位30到31的C位和进位?

5 个答案:

答案 0 :(得分:2)

这里有溢出标志,可以帮助我们捕获与标志不一致的地方。如您所知,ARM微处理器(例如M3)使用2的补码表示负数。在这种表示方案中,MSB指示我们正在处理的数字的符号。

  • 如果MSB = 1->负数
  • 如果MSB = 0->正数

然后,当操作结果具有意外符号时,将设置溢出标志。例如,令A = 01111b = 15d和B = 00001b = 1d。这两个数字都是正数(MSB = 0),但是将它们加在一起会发生什么?

A + B = 01111b + 01b = 10000b = -16d!

我们看看结果如何改变符号!溢出标志(通常表示为V)将按照此设置。

现在,我们可以确定在某些情况下不会设置溢出标志。例如,如果我们减去相同的符号幅度,则可以同时得到正和负结果,因此符号的变化不一定是错误。具有不同符号操作数的加法运算也是如此。然后,溢出时要注意的是,操作数具有相同符号的加法运算和操作数具有不同符号的减法运算。

此答案基于以下主题的维基百科文章:https://en.wikipedia.org/wiki/Overflow_flag

答案 1 :(得分:1)

一个非常简单的解释: 如果带有后缀“s”的ALU指令改变了MSB,则设置为V.

a = MSB(n); //before
d = ALUs(n);
b = MSB(d); // after
V = a ^ b;

答案 2 :(得分:0)

ARM处理器上的V标志是最后算术运算的指示符有符号溢出。例如,该标志将被设置为以下加法0x7FFFFFFF + 1 = 0x80000000(已添加2个正值但为负值)

对于NEG操作,如果MSB为1,则将设置V标志(U2中的最小值不具有可以与操作数相同的位数表示的负值)。在其他情况下(加法,减法),如果进入MSB将与执行MSB不同,则将设置它。

答案 3 :(得分:0)

我通常最终会阅读此页面:Condition Codes 1: Condition Flags and Codes

  

V :(签名)溢出

     

V标志与C标志的工作方式相同,但是   签署的业务。例如,0x7fffffff是最大的正数   二进制补码整数,可以用32位表示,所以   0x7fffffff + 0x7fffffff触发有符号溢出,但不是   无符号溢出(或进位):结果,0xfffffffe,如果是正确的   解释为无符号数量,但代表负值   (-2)如果被解释为签字数量。

答案 4 :(得分:0)

当您使用签名号码时,会出现溢出概念。 ARM整数寄存器(支持V7指令和更低指令的处理器)使用32位。整数算术不能区分有符号数和无符号数。请注意,只有在算术(例如加法)中使用正数或两者都为负的数字时才可以溢出。这是一个示例代码

    MOV r0,#0x40000000
    MOV r1,#0x40000000
    ADDS r3,r1,r0       ;; this will cause overflow bit to be set in NZCV flags

请注意,r0和r1包含正数。但它们的和0x80000000是有符号意义上的负数.32位不足以表示+ 0x80000000.Look在操作数的第31位,如果两者都是0(都是正数)或两者都是1(都是负数)并且第31位结果与第31位操作数不同,然后发生溢出。条件可以表示为

 ((31st bit of op1) equal to (31st bit of op2)) not equal to (31st bit of result)