我不理解SBC
和RSC
ARM指令
我知道两者都处理进位标志(C)
我认为使用carry(ADC
)添加结果是有道理的,如:
ADC r1, r2, r3 @ r1 = r2 + r3 + Carry
但是用进位减去/反减减... 我无法理解发生的事情:(
你们可以使用SBC
和RSC
给我一个例子吗?
答案 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语句成为可能。