我不明白SBC和RSC的ARM指令
我知道两者都处理进位标志(C)
我认为用进位(ADC)添加结果是有意义的,例如:
ADC r1, r2, r3 @ r1 = r2 + r3 + Carry 但是用进位减去/反向减去..。我不明白发生了什么事
你们能给我一个使用SBC和RSC的例子吗?
发布于 2016-12-21 01:08:31
对于两个补语,可以将减法转换为加法:
z = y - x
= y + (-x)
= y + ~x + 1这样可以更容易地考虑在这种情况下如何设置进位标志,即由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发布于 2018-07-27 14:20:01
我自己也遇到过这个小怪人。我认为重要的是要注意的是,拇指只有两个子指令字段,所以使用3个字段的任何逻辑都不能在1条指令中执行。
我有一个内环,它的C标志将适当地设置为一个ADCS,而不是一个SBCS。
拇指是为了产生更小的编译C而设计的,所以我只能假设它们是一些逻辑,但是速度根本没有被解决。
随着RORS,Rs指令格式,SBCS一直困扰着我。另一方面,您可以设置底部8寄存器并跳转到指定的地址,这使得产生非常快的开关语句成为可能。
https://stackoverflow.com/questions/41253124
复制相似问题