关于进位标志的 ARM 文档的混淆

Confusion about ARM documentation on carry flag

在 ARM 文档 here 中,它说:

A carry occurs:

... if the result of a subtraction is positive or zero ...

我从this answer on SO得知,当存在无符号下溢时(即被减数(减数)大于被减数(被减数))时,进位标志被设置为减法。

所以考虑这个例子:

r1 = 5
r2 = 10
CMP r1, r2

比较 (CMP) 执行减法 as mentioned here,然后设置适当的标志。在这种情况下,r1-r2 = 5-10 = -5。由于我们这里有无符号下溢 (5 < 10),我们希望设置进位标志。但根据 ARM 文档,结果 (-5) 不是正数或零,因此不应设置进位标志。 (假设我们查看已签名的结果;否则根据文档,进位永远不会发生)。

ARM文档有错吗?我的误会是什么?

ARM 使用反向进位标志进行借位(即减法)。这就是为什么只要没有借位就设置进位,只要有借位就清零。此设计决策使构建 ALU 稍微简单一些,这就是某些 CPU 这样做的原因。

我们不需要全部 32 位来显示减法的结果

5 - 3

从小学我们就知道 5 - 3 = 5 +(-3) 这就是它在逻辑中的实现方式,二进制补码的一个特点是得到 -3 你反转并加一所以

5 - 3

      1
   0101
 + 1100
=========

完成

  11011
   0101
 + 1100
=========
   0010

所以通常(不是特定于处理器)5 - 3 = 2。错误位的进位和进位都是一个,因此不会设置带符号的溢出,进位是 1。但有些架构也是如此因为反转第二个操作数和进位(到 lsbit)也会反转进位,称之为借位。有些没有。

当您查看关于进位位定义的大于和小于之类的内容时,有些文档会这样

5 - 4

  11111
   0101
 + 1011
=========
   0001

5 - 5

  11111
   0101
 + 1010
=========
   0000

5 - 6

  00011
   0101
 + 1001
=========
   1111

5 - 7

  00011
   0101
 + 1000
=========
   1110

这表明,如果您查看原始执行,当操作数 b 等于操作数 a 时,它会切换,当 b 小于 a 时,当 b 等于或大于 a 时,它会被设置。因此,如果体系结构保持不变,您可以使用进位位表示无符号大于或小于(但不等于),在大于或等于的情况之一中,大于或等于由该标志定义,哪个方向取决于体系结构(如果它将执行转换为借位)。另一个方向,您要么翻转操作数并使用一位,要么使用 N 和 C 来确定大于或等于的值。

与其他一些文档不同的是,arm 文档向您展示了每个条件的标志是什么,并且了解以上内容或能够在简单测试中重复它,您可以确定它们是否反转。指令 sbb 是带借位减法而不是 sbc 带进位减法,但它本身并不意味着该指令集如何解释该位。

我也有同样的困惑:

  • The ALU status flags
    • A carry occurs if the result of an addition is greater than or equal to 232, if the result of a subtraction is positive, or as the result of an inline barrel shifter operation in a move or logical instruction

想法: 5 - 3 = 2 -> positive result -> 应该 C=1 ?

终于找到ARM官方有用的文档:Carry flag

In A32/T32 code, C is set in one of the following ways:

  • For an addition, including the comparison instruction CMN, C is set to 1 if the addition produced a carry (that is, an unsigned overflow), and to 0 otherwise.
  • For a subtraction, including the comparison instruction CMP, C is set to 0 if the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.

了解:

  • 用于减法:5 - 10 = -5 -> produced a borrow = unsigned underflow = negative result -> 应该 C=0
    • 注意:不是 C=1

所以,符合:

  • 用于减法:5 - 3 = 2 -> positive result -> 应该 C=1