刘帅嵌入式系统-RSC逆向减法指令

本文深入解析了RSC指令的工作原理,该指令从指定数值中减去寄存器值及CPSR中C标志位的反码,将结果保存并更新条件标志位。通过具体实例展示了如何使用RSC指令求64位数值的负数。

在这里插入图片描述

RSC指令从< shifter_operand > 表示的数值中减去寄存器< Rn >值,再减去寄存器CPSR中C标志位的反码,并把结果保存到目标寄存器< Rd > 中,同时根据操作的结果更新CPSR中相应的条件标志位。

指令的编码格式

在这里插入图片描述

指令的语法格式

RSC{< cond >} {S} < Rd >, < Rn> ,< shifter_operand >

其中:

  • < cond >、S 和Rd的用法同之前介绍的ADD传输指令。
  • < Rn > 寄存器为第2个操作数所在的寄存器。
  • < shifter_operand >为第1个操作数。

指令操作的伪代码

if ConditionPassed<cond> then
	Rd=shifter_operand - Rn - NOT(C Flag)
	if S==1 and Rd==R15 then
		CPSR=SPSR
	else if S==1 then
		N Flag=Rd[31]
		Z Flag=if Rd==0 then 1 else 0
		C Flag=CarryFrom(shifter_operand - Rn - NOT(C Flag))
		V Flag=OverflowForm(shifter_operand - Rn - NOT(C Flag))

指令的使用

下面的指令序列可以求一个64位数值的负数。64位数放在寄存器R0与R1中,其负数放在R2与R3中。其中R0与R2中放低32位值。

RSBS R2, R0, #0		
RSC R3,R1, #0	;Rd=Rx*(2**n-1)

需要需要注意的是,在RSBS指令中,如果发生借位操作,CPSR寄存器中的C标志位设置成0;如果没有发生借位操作,CPSR寄存器中的C标志位设置成1。这与ADDS指令中的进位指令正好相反。这主要是为了适应SBC等指令的操作需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值