在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文档是否错误?我的误会是什么?
答案 0 :(得分:3)
ARM使用反向进位标志进行借位(即减法)。这就是为什么在没有借入时设置进位并在有借出时设置进位。这个设计决定使ALU的构建稍微简单一些,这就是某些CPU这样做的原因。
答案 1 :(得分:0)
我们不需要全部32位来显示减法发生的情况
5-3
从小学生那里我们知道5-3 = 5 +(-3)是逻辑上的完成方式,二进制补码的一个功能是将-3取反并加一个
5-3
1
0101
+ 1100
=========
完成
11011
0101
+ 1100
=========
0010
因此一般而言(不是特定于处理器的)5-3 =2。误入的进位和进位均为1,因此不会设置有符号的溢出,进位为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时,它将被置位。因此,如果体系结构保持不变,则可以在该标志定义的大于或等于1的情况下使用进位位来表示大于或小于(但不等于)的无符号数,并且哪个方向取决于体系结构(如果它转化为借入)。在另一个方向上,您可以翻转操作数并使用一位,或者使用N和C确定大于或等于的值。
与其他一些文档不同,arm文档向您显示了每个条件标志的含义,并了解上述内容或能够通过简单的测试重复进行标记,您可以弄清楚它们是反转还是不反转。指令sbb是用借位减去,而不是sbc用进位来减去sorta,但它本身并不意味着该指令集如何解释该位。