0

在此处的 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它们都视为无符号数字时的情况(就像我们在前一个场景中将它们都视为无符号数字时的情况一样低)。显然这不是真的,因为.350xffffffff > 0x00000000

当我尝试根据文档所说的内容计算进位标志逻辑时,如何解释这种矛盾?

4

2 回答 2

2

只有当输入值与完整(33 位)输出一起被视为无符号时,您的报价才有意义。请注意,随附的描述指的是大于 2^32 的输出。

于 2018-11-05T00:58:44.520 回答
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 则 singed 更大或相同,这是真的 -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 少两个

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

(进位集是一个无符号溢出顺便说一句,至少在这种情况下它有效)

于 2018-11-05T04:18:43.977 回答