4. 数据处理指令
数据处理指令包括数据传送指令、算术运算指令、逻辑运算指令以及比较指令4类。
MOV:是将8位的立即数或寄存器的内容传送到目标寄存器中,格式如下:
MOV{cond}{S}Rd, operand2
MOV R2, R1, LSL #2 @R2=R1*4
MVN:数据非传送指令,将8位的立即数或寄存器按位取反传送到目标寄存器,格式如下
MVN{cond}{S} Rd, operand2
MVN R0, #0xFF @R0=0xFFFFFF00
MVN R1, R2 @将R2寄存器数据取反后存入R1寄存器
ADD:加法指令,将Rn寄存器与operand2的值相加,结果保存到Rd寄存器,格式如下
ADD{cond}{S} Rd, Rn, operand2
ADD R0, R1, #2 @R0=R1+2
ADD R0, R1, LSL #3 @R0=R1*8
ADC:带进位加法指令,将Rn寄存器与operand2的值相加,再加上CPSR寄存器的C条件标志位值,最后将结果保存到Rd寄存器,格式如下:
ADC{cond}{S} Rd, Rn, operand2
ADC R1, R0 @ R0= R0+R1+CF
SUB: 减法指令,功能是用Rn寄存器减去operand2的值保存到Rd寄存器
SUB R0, R1, #4 @R0=R1-4
RSB: 逆向减法指令,功能是用operand2减去Rn寄存器,结果保存到Rd寄存器中
RSB{cond}{S} Rd, Rn, operand2
RSB R0, R1 @R0=-R1
SBC:带进位减肥指令,将Rn寄存器与operand2的值相减,再减去CPSR寄存器的C条件标志位值,最后将结果保存到Rd寄存器
SBC{cond}{S} Rd, Rn, operand2
SBC R0, R1, R2 @R0= R1-R2-CF
RSC: 带进位减法指令,即除了加两个数以外,还要把CPSR的C值也要带进来,类似SBC
MUL: 32位乘法,指令完成将Rm与Rm的乘法运算,并把结果放置到目的寄存器中
MUL R0, R1, R2 @R0 = R1 * R2
MULS R0, R1, R2 @R0 = R1 * R2 同时设置CPSR中的相关标志位
MLS: 将Rm寄存器和Rn寄存器的值相乘,然后再从Ra寄存器的值减去乘积,最后将所得结果的低32位存入Rd寄存器
MLS R0, R1, R2, R3 @R0=(R3-R1XR2)的结果低32位
MLA:带累加的相乘,将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数
MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA R0, R1, R2, R3 @R0 = R1*R2+R3
MLAS R0, R1, R2, R3 @R0=R1*R2+R3 同时设置CPSR中的相关标志位
UMULL:将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数
UMULL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
UMULL R0, R1, R2, R3 @R0 等于 R2*R3低32位值, R1等于R2*R3高32位值
UMLAL:将操作数1与操作数2的乘法运算,并把结果的64位与目的寄存器Low、目的寄存器High组成的64位数相加,结果的把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。操作数1和操作数2均为32位的无符号数
UMULAL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
UMLAL R0, R1, R2, R3 @ R0 = (R2*R3 + R1|R2)的低32位, R1 = (R2*R3 + R1|R2)的高32位
SMULL:将操作数1与操作数2的乘法运算,并把结果的64位与目的寄存器Low、目的寄存器High组成的64位数相加,结果的把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。操作数1和操作数2均为32位的有符号数
SMULL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
SMULL R0, R1, R2, R3 @R0 等于 R2*R3低32位值, R1等于R2*R3高32位值
SMLAL:将操作数1与操作数2的乘法运算,并把结果的64位与目的寄存器Low、目的寄存器High组成的64位数相加,结果的把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。操作数1和操作数2均为32位的有符号数
SMULAL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
SMLAL R0, R1, R2, R3 @ R0 = (R2*R3 + R1|R2)的低32位, R1 = (R2*R3 + R1|R2)的高32位
SMLAD: 将操作数1 Low和操作数 2 LOW相乘,然后操作数1 High和操作数 2 High相乘,最后将两个乘积与操作数3的值相加存入目标寄存器。
SMLAD{条件}{S} 目的寄存器,操作数1,操作数2, 操作数3
SMLAD R0, R1, R2, R3
SMLSD: 将操作数1 Low和操作数 2 LOW相乘,然后操作数1 High和操作数 2 High相乘,最后将两个乘积与操作数3的值相减存入目标寄存器。
SMLSD{条件}{S} 目的寄存器,操作数1,操作数2, 操作数3
SMLSD R0, R1, R2, R3
SDIV: 有符号数除法指令
SDIV{条件} 目的寄存器,操作数1,操作数2
SDIV R0, R1, R2
UDIV:无符号数除法指令
SDIV{条件} 目的寄存器,操作数1,操作数2
UDIV R0, R1, R2 @R0= R1/R2
ASR: 算术右移指令。将Rm寄存器算术右移operand2位,并使用符号位填充空位,移位结果保存到Rd寄存器中
ASR{条件}{S} Rd, Rm, 操作数
ASR R0, R1, #2 @将R1寄存器的值作为有符号数右移2位后赋给R0寄存器
AND: 逻辑与指令
AND{条件}{S} Rd, Rm, 操作数
AND R0, R0, #1 @验证R0最低位的值
ORR:逻辑或指令
ORR{条件}{S} Rd, Rm, 操作数
ORR R0, R0, #0x0F @@保留R0的低四位,其余的清零
EOR:异或指令
EOR{条件}{S} Rd, Rm, 操作数
EOR R0, R0, R0 @将R0的值为0
BIC:位清除指令,将Rm寄存器左移操作数,并将空位清0,移位结果保存到Rd寄存器中
BIC{条件}{S} Rd, Rm, 操作数
BIC R0, R0, #0x0F @将低四位清零,其余位保持不变
LSL: 逻辑左移指令
LSL{条件}{S} Rd, Rm, 操作数
LSL R0, R1, #2 @@R0= R1*4
LSR: 逻辑右移指令
LSR{条件}{S} Rd, Rm, 操作数
LSR R0, R1, #2 @R0= R1/4
ROR: 循环右移指令,将Rm寄存器循环右移操作数,寄存器右边移出的位移回到左边,移位结果保存到Rd寄存器
ROR{条件}{S} Rd, Rm, 操作数
ROR R1, R1 #1 @将R1寄存器的最低位移到最高位
RRX: 带扩展的循环右移指令,将Rm寄存器循环右移1位,寄存器最高位用标志位的值填充,移位结果保存到Rd寄存器
RRX{条件}{S} Rd, Rm
ROR R1, R1, #1 @将R1寄存器的最低位移到最高位
CMP: 使用Rn寄存器减去operand2的值,与SUBS指令功能相同,但CMP指令不保存计算结果,仅根据比较结果设置标志位
CMP{条件}{S} Rn, 操作数
CMP R0, #0 @判断R0寄存器值是否为0
CMN: 将操作数的值加到Rn寄存器上,与ADDS指令功能相同,但CMN指令不保存计算结果,仅根据结果设置标志位
CMN{条件} Rn, 操作数
CMN R0, R1
TST: 位测试指令, 将Rn寄存器的值与操作数的值进行与运算,与ADDS指令功能相同,但CMN指令不保存计算结果,仅根据结果设置标志位
TST{条件} Rn, 操作数
TST R0, #1 @判断R0寄存器最低位是否为1
TEQ:将Rn寄存器的值与操作数的值进行异或运算,与EORS指令功能相同,但CMN指令不保存计算结果,仅根据结果设置标志位
TEQ{条件} Rn, 操作数
TEQ R0, R1 @判断R0寄存器与R1寄存器是否相等
其他指令1:SWI NOP MRS MSR
SWI 软中断指令, 在android系统,调用0号中断,使用R7寄存器存放系统调用号
NOP 空操作指令
MRS 读状态寄存器
MSR 写状态寄存器
其他指令2:用于多媒体与浮点计算的NEON与VFP指令
NEON与VFP在android ndk程序很少见。