溢出vs携带标志,真正的基本术语

时间:2013-10-27 17:44:49

标签: assembly arm carryflag

我一直试图让我的头脑溢出vs进位(对于ARM7,但基本上我的意思是适用于任何东西的术语)。

我想我终于拥有了它 - 但我想检查一下我的“真正的基本理解”是否正确,所有复杂性都被删除了,是否真的只是归结为:

unsigned => V = 0   
V = 1 => bit n is incorrect
C = 1 => bit n+1 'exists'

谢谢,

1 个答案:

答案 0 :(得分:3)

这些状态位与溢出有关,与unsigned vs twos补码有关。

加法本身是独立的标志,也就是二重奏的美。一个逻辑块可用于无符号和有符号加法和减法。唯一对无符号vs有符号加法或减法有用的地方是溢出位,无符号溢出(a.k.a进位)和有符号溢出(a.k.a溢出)。

自从我们了解了小学入学后,随身携带的位置有望更加明显

   7
  +4
=====

你需要“携带一个”才能做到这一点。二进制文件完全相同,只是处理器通常具有固定数量的位置,在纸面上,操作的宽度与您有多少纸张有关。

因此,如果设置了msbit的执行,那么对于任何添加,那么存在无符号溢出,我们没有足够的位用于列数。

现在这会导致一些混乱,因为进位也被称为减法,这变成了一个实现的东西,所以我不一定(并且不要亲自)记住那个臂做到这一点,x86做到了,等等但是记得找出二进制补码数的一种方法是“反转并加一”。那么当你想从7中减去5时,你在逻辑中做的是,不是添加-5而是添加5的补码并设置(反转)进位

    1  <- invert or set the carry in bit
  111  <- 7 (0b111)
+ 010  <- ones complement of 5 (0b101)
=====

然后我们做数学

 1111  
  111  
+ 010  
=====
  010

结果是2(2b010)WITH A CARRY OUT?

不执行并不意味着无符号溢出。当做一个减法时,从溢出的角度来看反向执行。这是一些处理器变化的地方。当操作是减法时,有些将反转进位标志的结果,因此上述alu操作可能导致进位标志为1或进位标志为0,这取决于处理器,这也意味着在进行减法时如果处理器支持它,则进位将在进入时反转或不反转。

那么签名溢出呢?

让我们看一下三位模式

    unsigned signed
000  0       0
001  1       1
010  2       2
011  3       3
100  4      -4
101  5      -3 
110  6      -2
111  7      -1

因此,例如,如果我们要添加位模式2b011 + 2b010,无符号将是3 + 2 = 5,签名将是3 + 2 = -3 ... ummm,这是错误的。签名溢出会告诉你。执行,无符号溢出将不会为该操作设置,但签名溢出将是。使用x86甚至可能有一半溢出和完全溢出?多个溢出?有人有AL,AH和AX的东西..

反正

  0100  < - carry in and out
   011
 + 010
======
   100

注意进入msbit的进位是1,进位是0,这就是我们检测到有符号溢出的方式。

是的,你可以认为它是错误的,因为标志是错误的。从数学的角度来看,这是错误的,因为没有足够的位来存储答案,所以这个符号是错误的,如果我们有3位加法器,我们会得到7+,没有区别于7 + 5 = 12 = 0b1100的无符号加法5 = 4,执行表明没有足够的空间存储结果的所有位。无符号溢出。