数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。
数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
算术逻辑运算指令完结常用的算术与逻辑运算,该类指令不光将运算成果保存在意图寄存器中,一起更新CPSR中相应条件标志位。
比较指令不保存运算成果,只更新CPSR中相应的条件标志位。
数据处理指令共以下16条。
1、MOV指令
MOV指令的格局为:
MOV{条件}{S}意图寄存器,源操作数
MOV指令可完结从另一个寄存器、被移位的寄存器或将一个当即数加载到意图寄存器。
其间S选项决议指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MOV R1,R0;将寄存器R0的值传送到寄存器R1
MOV PC,R14;将寄存器R14的值传送到PC,常用于子程序回来
MOV R1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1
2、MVN指令
MVN指令的格局为:
MVN{条件}{S}意图寄存器,源操作数
MVN指令可完结从另一个寄存器、被移位的寄存器、或将一个当即数加载到意图寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到意图寄存器中。
其间S决议指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVNR0,#0;将当即数0取反传送到寄存器R0中,完结后R0=-1
3、CMP指令
CMP指令的格局为:
CMP{条件}操作数1,操作数2
CMP指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行比较,一起更新CPSR中条件标志位的值。
该指令进行一次减法运算,但不存储成果,只更改条件标志位。标志位表明的是操作数1与操作数2的联系(大、小、持平),例如,当操作数1大于操作操作数2,则尔后的有GT后缀的指令将可以履行。
指令示例:
CMPR1,R0;将寄存器R1的值与寄存器R0的值相减,并依据成果设置CPSR的标志位
CMP R1,#100;将寄存器R1的值与当即数100相减,并依据成果设置CPSR的标志位
4、CMN指令
CMN指令的格局为:
CMN{条件}操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或当即数取反后进行比较,一起更新CPSR中条件标志位的值。该指令实践完结操作数1和操作数2相加,并依据成果更改条件标志位。
指令示例:
CMNR1,R0;将寄存器R1的值与寄存器R0的值相加,并依据成果设置CPSR的标志位
CMN R1,#100;将寄存器R1的值与当即数100相加,并依据成果设置
5、TST指令
TST指令的格局为:
TST{条件}操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行按位的与运算,并依据运算成果更新CPSR中条件标志位的值。
操作数1是要测验的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。
指令示例:
TSTR1,#%1;用于测验在寄存器R1中是否设置了最低位(%表明二进制数)
TST R1,#0xffe;将寄存器R1的值与当即数0xffe按位与,并依据成果设置CPSR的标志位
6、TEQ指令
TEQ指令的格局为:
TEQ{条件}操作数1,操作数2
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行按位的异或运算,并依据运算成果更新CPSR中条件标志位的值。
该指令一般用于比较操作数1和操作数2是否持平。
指令示例:
TEQR1,R2;将寄存器R1的值与寄存器R2的值按位异或,并依据成果设置CPSR的标志位
7、ADD指令
ADD指令的格局为:
ADD{条件}{S}意图寄存器,操作数1,操作数2
ADD指令用于把两个操作数相加,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。
指令示例:
ADDR0,R1,R2;R0 = R1 + R2
ADDR0,R1,#256;R0 = R1 + 256
ADDR0,R2,R3,LSL#1;R0 = R2 + (R3 << 1)
8、ADC指令
ADC指令的格局为:
ADC{条件}{S}意图寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将成果存放到意图寄存器中。它运用一个进位标志位,这样就可以做比32位大的数的加法,留意不要忘掉设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。
以下指令序列完结两个128位数的加法,榜首个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算成果由高到低存放在寄存器R3~R0:
ADDSR0,R4,R8;加低端的字
ADCSR1,R5,R9;加第二个字,带进位
ADCSR2,R6,R10;加第三个字,带进位
ADCR3,R7,R11;加第四个字,带进位
9、SUB指令
SUB指令的格局为:
SUB{条件}{S}意图寄存器,操作数1,操作数2
SUB指令用于把操作数1减去操作数2,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SUBR0,R1,R2;R0 = R1 – R2
SUBR0,R1,#256;R0 = R1 – 256
SUBR0,R2,R3,LSL#1;R0 = R2 – (R3 << 1)
10、SBC指令
SBC指令的格局为:
SBC{条件}{S}意图寄存器,操作数1,操作数2
SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令运用进位标志来表明借位,这样就可以做大于32位的减法,留意不要忘掉设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SBCSR0,R1,R2;R0 = R1 – R2 -!C,并依据成果设置CPSR的进位标志位
11、RSB指令
RSUB指令的格局为:
RSB{条件}{S}意图寄存器,操作数1,操作数2
RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令可用于有符号数或无符号数的减法运算。
指令示例:
RSB R0,R1,R2;R0 = R2–R1
RSB R0,R1,#256;R0 = 256–R1
RSB R0,R2,R3,LSL#1;R0 = (R3 << 1) - R2
12、RSC指令
RSC指令的格局为:
RSC{条件}{S}意图寄存器,操作数1,操作数2
RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令运用进位标志来表明借位,这样就可以做大于32位的减法,留意不要忘掉设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令示例:
RSCR0,R1,R2;R0 = R2–R1 -!C
13、AND指令
AND指令的格局为:
AND{条件}{S}意图寄存器,操作数1,操作数2
AND指令用于在两个操作数上进行逻辑与运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令常用于屏蔽操作数1的某些位。
指令示例:
AND R0,R0,#3;该指令坚持R0的0、1位,其他位清零。
14、ORR指令
ORR指令的格局为:
ORR{条件}{S}意图寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令常用于设置操作数1的某些位。
指令示例:
ORR R0,R0,#3;该指令设置R0的0、1位,其他位坚持不变。
15、EOR指令
EOR指令的格局为:
EOR{条件}{S}意图寄存器,操作数1,操作数2
EOR指令用于在两个操作数上进行逻辑异或运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。该指令常用于回转操作数1的某些位。
指令示例:
EOR R0,R0,#3;该指令回转R0的0、1位,其他位坚持不变。
16、BIC指令
BIC指令的格局为:
BIC{条件}{S}意图寄存器,操作数1,操作数2
BIC指令用于铲除操作数1的某些位,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2可所以一个寄存器,被移位的寄存器,或一个当即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则铲除这一位。未设置的掩码位坚持不变。
指令示例:
BIC R0,R0,#%1011;该指令铲除R0中的位0、1、和3,其他的位坚持不变。