接 2
ARM数据处理指令
数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在存储器之间传送数据。数据处理指令可分为三类:数据传送指令、算术逻辑运算指令和比较指令。
数据传送指令用于寄存器和存储器之间进行双向传输;
算术逻辑运算指令完成常用的算数与逻辑的运算,将结果保存在目标寄存器中,同时更新CPSR的条件标志位;
比较指令是对寄存器与一个立即数或一个寄存器进行比较,不保存运算结果,只影响CPSR的条件标志位。
数据传送指令MOV和MVN
MOV指令
完成寄存器之间或寄存器与第二个操作数之间的数据传送。
#将寄存器r5的值传送给r4;
MVN指令
完成寄存器之间或寄存器与第二个操作数之间的数据非传送。与MOV指令不同的是把一个取反之后的值传送到目的寄存器中。
#将立即数0取反之后送到R0中,完成后R0=-1
算数逻辑指令
ADD指令(加法)
加法指令,将两个操作数相加存放到寄存器中。
ADDC R0,R3.#10; #R0=R3+10
ADD R0,R2,R3,LSL#2 //R0=R2+R3*4
ADC指令(带进位的加法)
把两个操作数相加,再加上CPSR的C条件标志位的值存放到寄存器中。这样就可以做比32位大的数的加法。
ADDS R1,R2,R3;
#R1=R1+R3
ADC R2,R2,R4;
#R2=R2+R4+C
SUB指令(减法)
操作数1减去操作数2,将结果保存到目的寄存器中。用于有符号数或无符号数的减法运算。
SUBS R0,R3,R4;
#R0=R3-R4
SUB R0,R2,R3,LSL#1;
#R0=R2-(R3<<1)
RSB(反减)
操作数2减去操作数1,将结果保存到目的寄存器中。用于有符号数或无符号数的减法运算。
RSB R0,R3,R4;
#R0=R4-R3
SUB R0,R2,R3,LSL#1;
#R0=R3*2-R2
SBC(带借位的减法)
操作数1减去操作数2,再加上CPSR的C条件标志位的值存放到寄存器中。
SBC R2,R2,R4;
#R2=R2-R4-C
RSC(带借位的反减法)
操作数2减去操作数1,再减去CPSR的C条件标志位的反码存放到寄存器中。
RSC R0,R2,R3,LSL#1;
#R0=R3*2-R4-C的反码 同时刷新标志位
AND(逻辑与)
常用来清零,即屏蔽操作数为1的某些位
AND R0,R2,R3;
#R0=R2^R3
AND R2,R2,#3;
#保持R2的0、1位,其余位清零
ORR(逻辑或)
常用来置1,即设置操作数为1的某些位
ORR R0,R2,R3;
#R0=R2或R3
ORR R2,R2,#3;
#设置R2的0、1位,其余位保持不变
EOR(逻辑异或)
通常进行逻辑异或运算,常用来反转操作数的某些位。
EOR R0,R2,R3;
#R0=R2异或R3
ORR R2,R2,#3;
#反转R2的0、1位为1,其余位保持不变
BIC(位清除)
常用来清除操作数为1的某些位,将结果保存到目的寄存器中。
BIC R0,R2,#2_0011;
清除R2中的0、1位,余位保持不变
BIC R0,R2,#0X80000000;
#清除R2中的31位,其余位保持不变 ,刷新标志位
MUL(乘法)
MUL R0,R2,R5;
#R0=R2*R5
#+## MLA(乘加)
操作数1与操作数2相乘再将乘积加上操作数3,结果存到目的寄存器中。
MLA R0,R1,R2,R3;
#R0=R1*R2+R3
SMULL(带符号的长乘法指令 )
操作数1与操作数2相乘再将乘积的低32位存到目的寄存器Low中,高32位存到目的寄存器High中。同时设置条件标志位。
与之对应的**UMULL**指令为无符号乘法指令。
SMULL R0,R1,R2,R3;
#R0=R2*R3 (低32位) ,R1=R2*R3 (高32位)
SMLAL(长乘加指令 )
操作数1与操作数2相乘再将乘积的低32位与寄存器Low中的值相加后存到目的寄存器Low中,高32位与寄存器High中的值相加存到目的寄存器High中。同时设置条件标志位。
与之对应的**UMLAL**指令为无符号长乘加指令。
SMULL R0,R1,R2,R3;
#R0=R2*R3 (低32位) +R1 ,R1=R2*R3 (高32位) +R2
比较和测试指令
CMP 指令(比较指令)
该指令实际上是做一个减法运算,但不存储结果,只是刷新条件标志位。
结果为正/负数,则N=0/1;
结果为0/非0,则Z=1/0;
产生借位则C=0,否则C=1;
符号溢出则V=1,否则V=0。
CMN指令(比较非指令)
该指令实际上是做一个减法运算,与CMP不同的是用操作数1减去操作数2的非值,但不存储结果,只是刷新条件标志位。
对条件标志位的影响与比骄傲指令CMP相同。