关于带进位标志的ARM文档的困惑

时间:2018-10-30 13:37:41

标签: assembly arm compare carryflag

在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文档是否错误?我的误会是什么?

2 个答案:

答案 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,但它本身并不意味着该指令集如何解释该位。