我们不需要所有 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 用进位减法,但它本身并不暗示该指令集如何解释该位。