在ARM文档here中,它表示:
C
当该操作导致进位时设置为1,否则清除为0。
和
发生进位:
...如果减法的结果是正数或零...
(很显然,结果必须被视为带符号的数字;否则,总会出现减法的进位)。
我知道进位标志在ARM中是“反转”的。因此,如果减法需要借位,那么即使在逻辑上确实发生了“进位”(即未签名的下溢),也不会设置进位标志。
在这种情况下这很有意义:
CMP 3,5
这将完成3-5
。自3 < 5
起,将发生无符号下溢,并且不会在ARM中设置进位标志。 使用ARM文档中的逻辑,3-5
得出-2
,它为负,因此不会发生进位,因此未设置进位标志。 >
现在,根据上面链接的ARM文档,ARM中的LO
(又名CC
)条件代码表示“无符号的,较低的”比较,当{在ARM中未设置进位标志(即true
)。因此,对于上面的示例,C == 0
条件代码为true。这也很有意义,因为将3和5都视为无符号数字时,它们要小于5。
========
现在考虑这种情况:
LO
这将执行CMP -1,0
,即-1-0
。从0xffffffff - 0x00000000
开始,从逻辑上讲,不会发生无符号下溢,并且会设置进位标志。
但是请看一下ARM文档中的内容:
发生进位:
...如果减法的结果是正数或零...
根据上述文档,由于0xffffffff > 0x00000000
的结果为-1-0
(它为负数),因此不会发生进位,因此未设置进位标志。但这意味着-1
条件代码为true,这意味着当将LO
都视为无符号数字时,-1
会比0
更低(就像3
低于5
(在上一场景中将它们都视为无符号数字时)。显然,自0xffffffff > 0x00000000
起,情况并非如此。
当我试图根据文档中的内容计算进位标记逻辑时,如何解释这一矛盾?
答案 0 :(得分:2)
仅当输入值与完整(33位)输出一起被视为无符号时,您的报价才有意义。请注意,随附的描述指的是大于2 ^ 32的输出。
答案 1 :(得分:0)
CC / LO的UNSIGNED较低而不是SIGNED较低。没有-1个无符号数,它是2 ^ 32-1、2 ^ 32-1-0 = 2 ^ 32-1和0绝对小于2 ^ 32-1。
现在,如果您想将-1与0进行比较,则这是一个带符号的比较,然后返回该表并查看与带符号的结果相关的标志。
两个数字一个比另一个大,因为写的清楚地想将它们解释为带符号的数学。
-3--4 = -3 + 4
11000
1101
+ 0100
=======
0001
N = 0 V = 0
如果N == V,则用更大或相同的单数表示,是的-3大于-4
1100 GT的符号大于N == V
-1-0 = -1 +(-0)= -1 + 0
0000
111
+000
=====
111
N = 1 V = 0
或者如果-1 +(-0)
1111
111
+ 111
=======
111
N = 1,V = 0
1011 LT的签名小于N!= V
这是真的-1小于零。
还有顺便说一句
3-5
00111
0011
+1010
=======
1110
无符号3-无符号5是一个非常大的数字0xFFFFFFFE,比2 ^ 32小2
C = 1,N = 1,V = 0,Z = 0
无符号C = 1表示
0010 CS / HS进行置位/未签名较高或相同
这是真的5大于3
如果您想让无符号数更高但不相同,那么您也可以查看Z标志
1000 HI无符号高C置位和Z清零
现在您正试图说3-5 = -2,这显然是带符号数学而不是带符号数学。所以V == Z
1100 GT签名大于
签名5大于签名3就像
0010 CS / HS进行置位/无符号更高或相同的C集
无符号5大于无符号3
3-5-0xFFFFFFFE
(进位设置是无符号溢出BTW,至少在这种情况下有效)