数据处理指令大致可分为3类:
1、数据传送指令;
2、算术逻辑运算指令;
3、比较指令。
指令格式 MVN{cond}{S} Rd,operand2
2、减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存到Rd中。指令格式如下:
SUB{cond}{S} Rd,Rn,operand2
应用示例:
3、逆向减法运算指令——RSB指令将operand2的值减去Rn,结果保存到Rd中。指令格式如下:
RSB{cond}{S} Rd,Rn,operand2
4、带进位加法指令——ADC将operand2的值与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下:
ADC{cond}{S} Rd,Rn,operand2
应用示例(使用ADC实现64位加法,结果存于R1、R0中):
SBC{cond}{S} Rd,Rn,operand2
应用示例(使用SBC实现64位减法,结果存于R1、R0中):
6、带进位逆向减法指令——RSC指令用寄存器operand2减去Rn,再减去CPSR中的C条件标志位的非,结果保存到Rd中。指令格式如下:
1、数据传送指令;
2、算术逻辑运算指令;
3、比较指令。
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均 可选择使用S后缀,并影响状态标志。
一 数据传送
指令格式 MOV{cond}{S} Rd,operand2
MOV Rd,operand2 数据传送
MOV指令举例如下 :
MOV R1,#0x10 ;R1=0x10
MOV R0,R1 ;R0=R1
MOVS R3,R1,LSL #2 ;R3=R1<<2,并影响标志位
MOV PC,LR ;PC=LR,子程序返回
指令格式 MVN{cond}{S} Rd,operand2
MVN Rd,operand2 数据非传送
MVN指令举例如下:
MVN R1,#0xFF ;R1=0xFFFFFF00
MVN R1,R2 ;将R2取反,结果存到R1
二算术运算
1、加法运算指令——ADD指令将operand2的值与Rn的值相加,结果保存到Rd寄存器。指令格式如下:
ADD{cond}{S} Rd,Rn,operand2
应用示例:
ADDS R1,R1,#1 ;R1=R1+1,并影响标志位
ADD R1,R1,R2 ;R1=R1+R2
2、减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存到Rd中。指令格式如下:
SUB{cond}{S} Rd,Rn,operand2
应用示例:
SUBS R0,R0,#1 ;R0=R0-1 ,并影响标志位
SUBS R2,R1,R2 ;R2=R1-R2 ,并影响标志位
3、逆向减法运算指令——RSB指令将operand2的值减去Rn,结果保存到Rd中。指令格式如下:
RSB{cond}{S} Rd,Rn,operand2
RSB R3,R1,#0xFF00 ;R3=0xFF00-R1
RSBS R1,R2,R2,LSL #2 ;R1=(R2<<2)-R2=R2×3
4、带进位加法指令——ADC将operand2的值与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下:
ADC{cond}{S} Rd,Rn,operand2
应用示例(使用ADC实现64位加法,结果存于R1、R0中):
ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位
ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位
5、带进位减法指令——SBC用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存到Rd中。指令格式如下:
SBC{cond}{S} Rd,Rn,operand2
应用示例(使用SBC实现64位减法,结果存于R1、R0中):
SUBS R0,R0,R2 ; 低32位相减,并影响标志位
SBC R1,R1,R3 ;高32位相减,并减去低位借位
6、带进位逆向减法指令——RSC指令用寄存器operand2减去Rn,再减去CPSR中的C条件标志位的非,结果保存到Rd中。指令格式如下: