3.2.2数据传送指令
LDR/STR指令用来在寄存器和内存之间输送数据。如果我们想要在寄存器之间传送数据,则可以使用MOV指令。MOV指令的格式如下。
MOV{cond}{s}Rd,oprand2
MOV{cond}{s}Rd,oprand2
其中,{cond}为条件指令可选项,{s}用来表示是否影响CPSR寄存器的纸,如MOVS指令就会影响寄存器CPSR的值,而MOV则不会,MVN指令用来将操作数operand2按位取反后传送到目标寄存器Rd,操作数operand2可以是一个立即数,也可以是一个寄存器。
MOV和MVN指令的一般使用方法如下。
MOVR1,#1
MOVR1,R0
MOVPC,LR
MVNR0,#0xff
MVNR0,R1
算术运算指令包括基本的加减乘除,逻辑运算指令包括与或非异或消除等,指令格式如下。
AOD{cond}{S}Rd,Rnoperand2,
ADC{cond}{S}Rd,Rn,operand2
SUB{cond}{S}Rd,Rn,operand2
AND{cond}{S}Rd,Rn,operand2
ORR{cond}{S}Rd,Rn,operand2
EOR{cond}{S}Rd,Rn,operand2
BIC{cond}{S}Rd,Rn,operand2
算数逻辑运算指令的基本使用方法以及说明如下
ADDR2,R1,#1
ADCR1,R1,#1
SUBR1,R1,R2
SBCR1,R1,R2
ANDR0,R0,#3
ORRR0,R0,#3
EORR0,R0,#3
BICR0,R0,#3
3.2.4操作数,operand2详解
ARM指令的可选项很多,操作数也很灵活,很多ARM指令会使用第二个参数operand2,可以是一个常数,也可以是寄存器+偏移的形式,操作数operand2在汇编程序中经常出现的两种格式如下。
#contant
第一种格式比较简单,操作室是一个立即数,第二种格式可以直接使用寄存器的值作为操作数。在3.2.3节中的ADD,SUB,AND指令示例种,第二个操作数要么是一个常数,那么是一个寄存器,在第二种格式中,通过{shift}可选性,我们还可以通过多种移位或者循环移位的方式。构建更加灵活的操作数,可以选择的移位方式如下。
#constant将立即数constant循环右移n位
ASR算数右移n位,n的取值范围
LSL逻辑左移n位,n的取值范围{1,32}
ROR向右循环移动n位,n取值范围{1,31}
RRX向右循环移动1位带扩展
typeRs仅仅在ARM中可用,,其中type指ASP,LSL,LSR,RCR,Rs是提供移位数据的指令