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

ARM处理器中的溢出标志是如何结合在一起的?,arm,overflow,Arm,Overflow,ARM处理器中的V(溢出)标志是如何创建的?是进位异或最高(31位)=负位吗?异或??或者是位30到31之间的C位和进位?ARM处理器上的V标志指示last的算术运算有符号溢出。例如,将为以下加法设置标志0x7FFFFFFF+1=0x8000000(添加了2个正VAL,但得到了负VAL) 对于NEG操作,如果MSB为1,则将设置V标志(U2中的最小值不具有可以用与操作数相同的位数表示的负值)。在其他情况下(加法、减法),如果进位到MSB与进位到MSB不同,则会进行设置。ARM处理器上的V标志指示

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

ARM处理器上的V标志指示last的算术运算有符号溢出。例如,将为以下加法设置标志0x7FFFFFFF+1=0x8000000(添加了2个正VAL,但得到了负VAL)


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

ARM处理器上的V标志指示last的算术运算有符号溢出。例如,将为以下加法设置标志0x7FFFFFFF+1=0x8000000(添加了2个正VAL,但得到了负VAL)


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

我通常会阅读本页:

V:(签名)溢出

V标志的工作原理与C标志相同,但 用于签名操作。例如,0x7FFFFF是最大的正值 2的补码整数,可以用32位表示,所以 0x7fffffff+0x7fffffff会触发有符号溢出,但不会触发 无符号溢出(或进位):如果 解释为无符号量,但表示负值 (-2)如果解释为有符号的数量


我通常会阅读这一页:

V:(签名)溢出

V标志的工作原理与C标志相同,但 用于签名操作。例如,0x7FFFFF是最大的正值 2的补码整数,可以用32位表示,所以 0x7fffffff+0x7fffffff会触发有符号溢出,但不会触发 无符号溢出(或进位):如果 解释为无符号量,但表示负值 (-2)如果解释为有符号的数量


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

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

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

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

溢出的概念是在处理有符号的数字时出现的。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包含正数。但它们的总和0x8000000是有符号意义上的负数。32位不足以表示+0x8000000。请查看操作数的第31位,如果两者都是0(都是正数)或都是1(都是负数),并且结果的第31位与操作数的第31位不同,然后发生溢出。该情况可以表示为

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

溢出的概念是在处理有符号的数字时出现的。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包含正数。但它们的总和0x8000000是有符号意义上的负数。32位不足以表示+0x8000000。请查看操作数的第31位,如果两者都是0(都是正数)或都是1(都是负数),并且结果的第31位与操作数的第31位不同,然后发生溢出。该情况可以表示为

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

溢出标志用于帮助我们发现与符号不一致的情况。您可能知道,像M3这样的ARM微处理器使用2的补码来表示负数。在此表示方案中,MSB表示我们正在处理的数字的符号

  • 如果MSB=1->负数
  • 如果MSB=0->正数
然后,当操作结果具有意外符号时,将设置溢出标志。例如,设A=0111b=15d,B=00001b=1d。这两个数字都是正数(MSB=0),但当我们将它们相加时会发生什么

A+B=0111B+01b=10000b=-16d

我们看到结果如何改变了符号!溢出标志(通常表示为V)将按照以下要求设置

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


这个答案基于维基百科的一篇文章:

溢出标志可以帮助我们发现符号的不一致性。您可能知道,像M3这样的ARM微处理器使用2的补码来表示负数。在此表示方案中,MSB表示我们正在处理的数字的符号

  • 如果MSB=1->负数
  • 如果MSB=0->正数
然后,当操作结果具有意外符号时,将设置溢出标志。例如,设A=0111b=15d,B=00001b=1d。