关于进位标志的 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
在 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