'错误' ARM减法指令中进位标志的用法?

时间:2014-12-06 02:51:13

标签: arm gas

带有进位(SBCRSC)的ARM减法指令将进位标志(C)解释为:

  • 0表示借用
  • 1表示不借用

为什么携带标志C被反转来进行算术运算?

SBC R0, R1, R2 @ R0 = R1 - R2 - !C

1 个答案:

答案 0 :(得分:4)

我们从小学了解

a = b - c = b + (-c)

从基本编程类中,在二进制补码中否定一个数字,我们将一个数字反转并添加一个

a = b + (~c) + 1

这很好用,因为当我们向加法器逻辑提供我们的值时,我们将第二个操作数反转并反转进位。(没有减法逻辑,你使用加法器进行减法)

因此,一些处理器实现选择反转执行。你已经反转的东西做了减法,并且正常减法(没有借用)的msbit的原始执行是1,当有借位时,执行是0,所以反转执行你可以然后称之为"借用"代替进位(或代替借/或借或借)

你采用哪种方法,如果你有借位减法,那么你需要反转或不反转进位,这取决于你的设计选择,以便减法执行(正常而不借用)。

所以减法是

a = b + (~c) + 1

当你级联那个减法(sbc)然后如果没有借用那么

a = b + (~c) + 1

但如果有借用,那么下一级需要删除1,所以sbc变为

a = b + (~c) 

在这种情况下,进位为零。因此,从加法器逻辑的角度来看,当你使用借位减去时,你自然必须反转第二个操作数,但是如果你必须借用则输入0,如果你不这样做,则输入1。

SBC上的手臂文档说

  

Rd = Rd - Rm - NOT(C标志)

因此,如果由于事先借入我们需要拿走一个,那么C必须是0,否则C是1进入。

减法基本上都说

  

C Flag = NOT BorrowFrom(操作)

因此,如果我们需要借用,那么借用是真的,所以C标志不是真或者是0.如果我们不需要借,那么借来的是假的0,而不是借来的是1.所以所有匹配,如果我们需要借用,那么进入SBC C需要为0.

所以基本上ARM似乎没有修改加法器的执行。因此,它不需要在SBC上反转进位。