在ARM文档here中,它说:
出现进位:
.如果减法的结果是正的或零.
我从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的文档是错误的吗?我误会什么了?
3条答案
按热度按时间wd2eg0qa1#
ARM使用反向进位标志进行借位(即,减法)。这就是为什么在没有借入的时候设置进位,而在有借入的时候设置清零。这种设计决策使得构建ALU稍微简单一些,这就是为什么有些CPU这样做。
7kqas0il2#
我们不需要所有的32位来显示减法是怎么回事:
五比三
从小学我们知道,5 - 3 = 5 +(-3),这是它是如何在逻辑上完成,二进制补码的一个特点是得到-3你反转和添加一个,所以:
五比三
完成它:
所以一般来说(不是处理器特定的)5 - 3 = 2。MSbit的进位输入和进位输出都是1,因此带符号的溢出将不被设置,进位输出是1。但是有些架构除了反转第二个操作数和进位(到lsbit)之外,还反转进位输出,称之为借用。有些人不会。
当你看到大于和小于之类的东西时,有些文件会记录进位的定义:
5 - 4
五比五
5 - 6
5 - 7
这表明,如果你看一下原始进位,当操作数B等于操作数a时,它会切换,当B小于a时,它会被设置,当B等于或大于a时,它会被清除。因此,如果架构保持不变,您可以使用进位来表示无符号大于或小于(但不等于),其中一种情况是大于或等于由该标志定义,并且方向取决于架构(如果它将进位反转为借用)。在另一个方向上,你要么翻转操作数,使用一位,要么使用N和C来确定大于或等于。
与其他一些文档不同,arm文档向您展示了每个条件的标志,并且知道上面的内容或能够在简单的测试中重复它,您可以弄清楚它们是否反转。用借位减去指令SBB,而不是用进位减去指令SBC,这意味着指令集如何解释该位,但不是通过其自身。
rhfm7lfc3#
我也有同样的困惑:
5 - 3 = 2
->positive result
->应该C=1
吗?终于找到了ARM官方的有用文档:Carry flag
在A32/T32代码中,C以下列方式之一设置:
了解:
5 - 10 = -5
->produced a borrow
=unsigned underflow
=negative result
->应C=0
C=1
因此,符合:
5 - 3 = 2
->positive result
->应该C=1