Android基础知识 — 1.3-ARM和Thumb指令详解2

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程序很少见。

猜你喜欢

转载自blog.csdn.net/qincheng168/article/details/128279921