在ARM文档这里中,它说:
C 当操作导致进位时,设置为1,否则清除为0。
和
结转发生: ..。如果减法的结果是正数或零.
(显然,结果必须被视为一个有符号的数字;否则,进位总是会发生减法)。
我知道旗子在手臂上是“倒”的。因此,如果减法需要借用,那么即使“进位”(即未签名的下流量)确实发生在逻辑上,也不会设置进位标志。
对于这种情况,这是有意义的:
CMP 3,5
这将执行3-5。由于3 < 5,未签名的下溢发生,并且进位标志不会在ARM中设置。使用ARM文档中的逻辑,3-5 3-5会导致 -2**,为负值,因此不会发生进位,因此不会设置进位标志。
现在,根据上面链接的ARM文档,ARM中的LO (又名CC)条件代码表示“无符号、较低”的比较,在ARM (即C == 0)中没有设置进位标志时,它是true。因此,对于上面的示例,LO条件代码将为真。这也是有意义的,因为3是低于5,当他们都被视为无符号数字。
========
现在考虑一下这个场景:
CMP -1,0
这将适用于-1-0 ( 0xffffffff - 0x00000000 ).从逻辑上讲,由于0xffffffff > 0x00000000,不发生无符号下溢,并且将设置进位标志。
,但是看看ARM文档上写着什么:
结转发生: ..。如果减法的结果是正数或零.
根据上面的文档,因为-1-0导致-1为负值,因此不会发生进位,因此不会设置进位标志。但这意味着LO条件代码是真的,这意味着当将它们都视为无符号数字时,-1比0低(就像在前面的场景中,当我们将它们都作为无符号数字处理时,3是如何低于5的)。显然,自从0xffffffff > 0x00000000之后就不是这样了。
当我试图根据文档的意思计算进位标志逻辑时,我该如何解释这个矛盾呢?
发布于 2018-11-05 00:58:44
只有当输入值与完整(33位)输出一起被视为无符号时,引用才有意义。注所附说明指大于2^32的输出。
发布于 2018-11-05 04:18:43
CC/LO没有签名,更低而不是更低。无符号数为-1,为2^32-1,2^32-1 -0= 2^32-1,0绝对小于2^32-1。
现在,如果您想要比较-1到0,那么这是一个有符号的比较,然后返回到那个表,并查看与签名结果相关的标志。
两个数字,一个比另一个大,显然想把它们解释成签名的数学。
-3 -4 = -3 +4
 11000
  1101
+ 0100
=======
  0001N=0 V=0
如果N == V的烧录值大于或相同,则-3大于-4。
大于N == V
-1-0= -1 + (-0) = -1 +0
 0000 
  111
 +000
=====
  111N=1V=0
或者如果-1 + (-0)
  1111
   111
 + 111
=======
   111N= 1,V=0
1011 LT签名小于N!=V
这是真的-1小于零。
和BTW
3-5
 00111
  0011
 +1010
=======
  1110无符号3-无符号5是一个很大的数字0xFFFFFFE 2^32
C= 1,N= 1,V= 0,Z=0
无符号C=1表示
0010 CS/HS进位集/无符号更高或相同
这是真的,5大于3
如果您想让未签名的更高但不一样,那么您也可以查看Z标志
1000 HI无符号高C集和Z clear
现在你们试图论证3-5= -2,这显然是有符号的数学,而不是无符号的数学。so V == Z
1100 GT签名大于
有符号的5比签名的3大,就像
0010 CS/HS进位集/无符号C集
无符号的5大于无符号的3。
3-5=0xFFFFFFE
(进位集是一个无符号溢出BTW,至少在本例中是有效的)
https://stackoverflow.com/questions/53145093
复制相似问题