我无法理解ARM中的一些指令:SBC,RSC

时间:2016-12-20 23:57:49

标签: assembly arm instructions carryflag

我不理解SBCRSC ARM指令

我知道两者都处理进位标志(C)

我认为使用carry(ADC)添加结果是有道理的,如:

ADC r1, r2, r3   @ r1 = r2 + r3 + Carry 

但是用进位减去/反减减... 我无法理解发生的事情:(

你们可以使用SBCRSC给我一个例子吗?

2 个答案:

答案 0 :(得分:3)

给定两个补码,减法可以转换为加法:

z = y - x
  = y + (-x)
  = y + ~x + 1

这样可以更容易地考虑在这种情况下进位标志 set 的方式,即subs

   z = 0 - 0
     = 0 + ffffffff + 1
 C:z = 1:00000000        // no borrow, C = 1

   z = 0 - 1
     = 0 + fffffffe + 1
 C:z = 0:ffffffff        // borrow, C = 0

因此,为什么C标志的值是nB(“不借用”),所以sbc为“减去携带”意味着“减去而不借”,换句话说:

z = y + ~x + C           // i.e. adc with the second operand inverted
  = y - (x - 1) - (~C + 1)
  = y - x - ~C

答案 1 :(得分:0)

我自己遇到了这个小怪癖。我认为必须注意,Thumb对于SUBS指令只有2个字段,因此使用3个字段的任何逻辑都不能在1个指令中执行。

我有一个内部循环,可以为ADCS而不是SBCS适当设置C标志。

Thumb旨在产生较小的编译C,因此我只能假定它们是某种逻辑,但是速度根本无法解决。

伴随着RORS Rd,Rs指令格式,SBCS让我感到困惑。从好的方面来说,您可以设置底部的8个寄存器并跳转到指定的地址,这使得生成非常快速的switch语句成为可能。