在此处的 ARM 文档中,它说:
C
当操作导致进位时设置为 1,否则清零。
和
进位发生:
...如果减法的结果是正数或零...
(显然,结果必须被视为有符号数;否则减法总是会出现进位)。
我知道进位标志在 ARM 中是“反转的”。因此,如果减法需要借位,则即使逻辑上确实发生了“进位”(即无符号下溢),也不会设置进位标志。
这对于这种情况是有意义的:
CMP 3,5
这会做3-5
。由于3 < 5
,发生无符号下溢并且进位标志不会在 ARM 中设置。使用 ARM 文档中的逻辑,3-5
结果为-2
,这是负数,因此不会发生进位,因此未设置进位标志。
现在,根据上面链接的 ARM 文档,ARM 中的LO
(aka CC
)条件代码表示“无符号,较低”比较,是true
在 ARM 中未设置进位标志时(即C == 0
)。因此,对于上面的示例,LO
条件代码将为真。这也是有道理的,因为当将它们都视为无符号数时,3 小于 5。
========
现在考虑这种情况:
CMP -1,0
这会做-1-0
,即0xffffffff - 0x00000000
。从逻辑上讲,因为0xffffffff > 0x00000000
不会发生无符号下溢,并且会设置进位标志。
但是看看 ARM 文档是怎么说的:
进位发生:
...如果减法的结果是正数或零...
根据上面的文档,由于-1-0
结果-1
为负数,因此不会发生进位,因此未设置进位标志。但这意味着LO
条件代码为真,这意味着-1
低于将0
它们都视为无符号数字时的情况(就像我们在前一个场景中将它们都视为无符号数字时的情况一样低)。显然这不是真的,因为.3
5
0xffffffff > 0x00000000
当我尝试根据文档所说的内容计算进位标志逻辑时,如何解释这种矛盾?