ARM汇编指令集.

ARM汇编指令集

1 跳转指令 1.1 跳转指令B:

B LABLE ;跳转到标号LABEL处 B 0X1111 ;跳转到绝对地址0X1111处 1.2 带连接的跳转指令 BL:

START ?

BL NEXT ;跳转到标号NEXT处,同时保存当前PC到R14中 ? ;返回地址

NEXT? ;子程序入口 MOV PC,R14 ;返回 1.3 带状态切换的跳转指令BX:

MOV R0, #0X0201

BX R0 ;程序跳转到0x0200处,微处理器切换到Thumb状态(地址必须是4的倍数,否则产生不可预知的后果) 2 算术运算指令 2.1不带进位加法指令ADD

ADD R0, R1, R2 ;R0← (R1)+(R2) ADD R0, R1, #112 ;R0← (R1)+ 112

ADD R0, R1, R2, LSL #1 ;R0←(R1)+(R2<<1) ;将R2中的值左移1位,再与R1值相加,结果送R0

2.2带进位加法指令 ADC

ADDS R0, R3, R6 ;加最低位字节,不带进位 ADCS R1, R4, R7 ;加第二个字,带进位 ADCS R2, R5,R8 ;加第三个字,带进位

;三句话实现了96bit加法运算,由于ARM寄存器宽度只有32bit所以分三次相加 2.3 不带进位减法指令SUB ;S—进位标志

SUB R0, R1, R2 ;R0←(R1)- (R2) SUB R0, R1, #112 ;R0←(R1)- 112 SUB R0, R1 ,R2 LSL#1 ;R0←(R1)- (R2<<1) 2.4 带进位减法指令SBC

SUBS R0, R3, R6 ;减最低位字节,不带进位 SBCS R1, R4, R7 ;减第二个字,带进位 SBCS R2, R5, R8 ;减第三个字,带进位

;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减 2.5 不带进位逆向减法指令RSB

RSB R0, R1, R2 ;R0←(R2)- (R1) RSB R0, R1, #112 ;R0← 112- (R1) RSB R0, R1, R2, LSL#1 ;R0←(R2<<1)-R1 2.6 带进位逆向减法指令RSC

RSBS R0, R6, R3 ;减最低字节的字,不带进位 RSCS R1, R7, R4 ;减第二个字,带进位 RSCS R2, R8, R5 ;减第三个字,带进位

;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减

1

2.7 32位乘法指令MUL

MUL R0, R1, R2 ;R0←(R1) X(R2)

MULS R0, R1, R2 ;R0←(R1) X(R2) ;更新CPSR标志位

2.8 乘-累加指令 MLA

MLA R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3)

MLAS R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3) ;更新CPSR标志位

2.9 无符号数长乘指令 UMULL MOV R5, #0X01 MOV R8, #0X02

UMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8) ;UMULL指令实现64bit无符号数乘法 2.10 无符号长乘-累加指令 UMLAL

MOV R0, #0X01 MOV R1, #0X02 MOV R5, #0X01 MOV R8, #0X02

UMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节 ;R1←(R1) +(R5) X(R8)高字节 ;UMLAL 指令为64位无符号乘-累加指令 2.11 有符号长乘指令SMULL MOV R5, #0X01 MOV R8, #0X02

SMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8) ;SMULL指令实现64bit有符号数乘法 2.12 有符号长乘-累加指令 SMLAL

MOV R0, #0X01 MOV R1, #0X02 MOV R5, #0X01 MOV R8, #0X02

SMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节 ;R1←(R1) +(R5) X(R8)高字节 ; SMLAL 指令为64位有符号乘-累加指令

2.13 比较指令 CMP

CMP R1, #0X10 ;比较

BGT TAG ;R1> #0X10转到TAG标号处 2.14

负数比较指令 CMN

CMN R0, #1 ;判断R0中的值是否为1的补码,是则置标志位Z为1

3 逻辑运算指令 3.1 “与”指令 AND

MOV R0, 0XFF

AND R0, R0, #3 ;取出R0的最低2bit 3.2 “或”指令 ORR

MOV R0, 0XFF ORR R0, R0, #3

2

3.3 “异或”指令 EOR

MOV R0, 0XFF

EOR R0, R0, #3 ;R0←(R0)^(0X03) 3.4 位清除指令 BIC

MOV R0, 0XFF

BIC R0, R0, #B11 ;寄存器R0的低2bit被清零 3.5 测试比较指令 TST

TST R1, #b11 ;测试寄存器R1中的第0位和第1位,更新CPSR中标志位,应用中会在TST指令后加一条跳转指令。 3.6 异或测试指令 TEQ

TEQ R0, R1 ;R1和R0中的值按位异或,更新CPSR,实际应用中用TEQ指令测试两个寄存器中的数值是否相等。

4 存储器访问指令

LDR R1, [R0, #0X08] ;读取R0+0X08地址处的数据,保存到R1 ;完成后R0中的数据保持不变 LDR R1, [R0] LDR R1, [R0, R2]

LDR R1, [R0, R2, LSL#2] ;读取R0+ (R2<<2)地址处的数据,保存到R1 LDR R1, LABEL ;LABEL 为程序标号,必须是当前指令的±4KB LDR R1, [R0], #0X04

LDR R1, [R0], #0X04 ;读取R0地址处的数据,保存到R1 ;指令执行后R0中值变为R0+0X04

4.1 字加载指令LDR 注意:使用LDR指令时字节地址是4的倍数

4.2 字存储指令 STR

STR R0, [R1, #4] ;将R0中的数据保存到内存地址(R0)+4中 4.3 字节加在指令 LDRB (低8位)

LDRB R0, [R1, #4] ;将地址(R1)+4处的1字节存储到寄存器R0的低

;位,并将R0的高24位清零

4.4 字节存储指令 STRB

STRB R1, [R0, #0X04] ;将R1的低8位存到地址R0+0X04处 ;执行后R0中数据不变 4.5 半字加载指令 LDRH (低16位)

LDRH R0, [R1, #8] ;将R1+8地址处的16位数据送R0中 LDRH R0, [R1, R2] ;将R1+R2地址处的数据送寄存器R0中 4.6 半字存储指令 STRH

STRH R1, [R0, #0X04] ;将R1的低16bit数据存到地址R0+0X04处 4.7 用户模式数据加载存储指令 用户模式数据加载存储指令 LDRT 功能和LDR指令相同,当微处理器在特权模式下使用此指令时,内存系统将该操作当做一般用户模式下的内存访问指令 STRT LDRBT STRBT 同上 同上 同上 功能描述 3

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4