OJF*_*ord 2 assembly arm carryflag
我一直试图弄清楚溢出与进位(对于 ARM7,但足够基本,我的意思是适用于任何事物的术语)。
我想我终于明白了——但我想检查一下我的“真正的基本理解”是否正确,所有的复杂性都被消除了,是否真的可以归结为:
unsigned => V = 0
V = 1 => bit n is incorrect
C = 1 => bit n+1 'exists'
Run Code Online (Sandbox Code Playgroud)
谢谢,
这些状态位,关于溢出,与无符号与二进制补码有关。
加法本身是符号无关的,这就是补码的妙处。一大块逻辑可用于无符号和有符号加法和减法。无符号与有符号加法或减法唯一重要的地方是溢出位、无符号溢出(又名进位)和有符号溢出(又名溢出)。
由于我们在小学学习了进位,因此进位位希望更加明显:
7
+4
=====
Run Code Online (Sandbox Code Playgroud)
您需要“携带一个”才能进行添加。在二进制中完全相同,除了处理器通常具有固定数量的位置,在纸上,操作的宽度与您有多少纸有关。
因此,如果carry out设置了 msbit 的任何添加,则存在无符号溢出,我们没有足够的位用于列数。
现在这会导致一些混乱,因为进位位也被讨论用于减法,这变成了一个实现,所以我不一定(也不会亲自)记住 arm 是这样做的,x86 是这样做的,等等。 但是请记住,找出二进制补码数的一种方法是“反转并加一”。好吧,例如,当您想从 7 中减去 5 时,您在逻辑中要做的不是添加 -5,而是添加5的补码并设置(反转)该carry in位:
1 <- invert or set the carry in bit
111 <- 7 (0b111)
+ 010 <- ones complement of 5 (0b101)
=====
Run Code Online (Sandbox Code Playgroud)
然后我们做数学:
1111
111
+ 010
=====
010
Run Code Online (Sandbox Code Playgroud)
结果是 2 (2b010) WITH A CARRY OUT?
不,这carry out并不意味着无符号溢出。在做减法时,carry out从溢出的角度考虑倒置。这是一些处理器不同的地方。carry flag当操作是减法时,有些会反转结果,因此上述 ALU 运算可能会导致减法的 a carry flagof 1 或 a carry flagof 0 取决于处理器,这也意味着如果处理器支持,则在使用借位进行减法时,carry in将反转或不进入。
那么签名溢出呢?
好吧,让我们看一下三位模式:
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
Run Code Online (Sandbox Code Playgroud)
因此,例如,如果我们要添加位模式 2b011 + 2b010,无符号将是 3+2 = 5,有符号将是 3+2 = -3...嗯,这是错误的。该符号溢出会告诉你。的carry out,无符号溢出不会为操作设置,但签署的溢出会。使用 x86 甚至可能有一半溢出和完全溢出?不止一个溢出?有人有一个与AL,AH和AX东西..
反正
0100 < - carry in and out
011
+ 010
======
100
Run Code Online (Sandbox Code Playgroud)
注意carry inmsbit 是 1 而carry out是 0,这就是我们检测到有符号溢出的方式。
是的,您可以将其视为 n 位错误,因为符号错误。不过,从数学的角度来看这并没有错,因为没有足够的位来存储答案,所以符号是错误的,这与 7+5 = 12 = 0b1100 的无符号加法没有什么不同,如果我们有一个 3 位加法器,我们将得到 7+5 = 4 并carry out表示没有足够的空间来存储结果的所有位。无符号溢出。