指令格式:指令{条件}{S} {目的Register},{OP1},
{OP2} "{ }"中的内容可选。即,可以不带条件只有目的寄存器,或
只有目的寄存器和操作数1,也可以同时包含所有选项。“S”决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值
助记符英文全称示例、功能
跳转指令
B
Branch
跳转指令
B Label;程序无条件跳转到标号Label处执行
BL
Branch with Link
带返回的跳转指令
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到
R14中
BLX
Branch with Link and exchange
带返回和状态切换的跳转指令
BLX Label;从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状
态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中BX
Branch and exchange
带状态切换的跳转指令
BX Label ;跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指
令,也可以是Thumb指令
数据处理MOV
Move
数据传送
MOV R1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1
MVN
Move NOT
数据非传送
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1
CMP
Compare
比较指令
CMP R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的
标志位
CMN
Compare negative
负数比较指令
CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的
标志位
TST
Test
位测试指令
TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR
的标志位
TEQ
Test equivalence
相等测试指令
TEQ R1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR
的标志位
ADD
Add
加法运算指令
ADD R0,R2,R3,LSL#1; R0 = R2 + (R3 << 1)
ADC
Add with carry
带进位加法
ADCS R2,R6,R10; R2 = R6+R10+!C,且更新CPSR的进位标志位
SUB
Subtract
减法运算指令
SUB R0,R1,#256; R0 = R1 – 256
SBC
Subtract with carry
带进位减法指令
SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位RSB
Reverse subtract
逆向减法指令
RSB R0,R1,R2 ; R0 = R2 – R1
RSC
Reverse subtract with carry
带进位逆向减法指令
RSC R0,R1,R2; R0 = R2 – R1 - !C
AND
And
逻辑与操作指令
AND R0,R0,#3;该指令保持R0的0、1位,其余位清零。
ORR
OR
逻辑或操作指令
ORR R0,R0,#3;该指令设置R0的0、1位,其余位保持不变。
EOR
Exclusive OR
逻辑异或操作指令
EOR R0,R0,#3 ;该指令反转R0的0、1位,其余位保持不变。
BIC
Bit clear
位清除指令
BIC R0,R0,#0b1011;该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。CLZ Count left zero 计算操作数最高端0的个数
乘加指令
MUL
Multiply
32位乘法指令
MUL R0,R1,R2 ;R0 = R1 × R2
MLA
Multiply and accumulate
32位乘加指令
MLAS R0,R1,R2,R3;R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位SMULL
Signed multiply long
64位有符号数乘法指令
SMULL R0,R1,R2,R3;R0 = (R2 × R3)的低32位 R1 = (R2 × R3)的
高32位
SMLAL
Signed mul l and accumulate l
64位有符号数乘加指令SMLAL R0,R1,R2,R3;R0 =(R2 × R3)的低32位+R0; R1 =(R2 × R3)的高32位+ R1
UMULL
Unsigned multiply long
64位无符号数乘法指令UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位;R1 =(R2 × R3)的高32位
UMLAL
Unsigned mul&accumulate lon
64位无符号数乘法指令UMLAL R0,R1,R2,R3 ;R0 =(R2 × R3)的低位+R0;R1 =(R2 × R3)的高32位+R1
PSR 访问MRS
Move PSR to register
程序状态寄存器到通用寄存器的数
据传送指令
MRS R0,CPSR;传送CPSR的内容到R0
MSR
Move register to PSR通用寄存器
到程序状态寄存器的数据传送指令
MSR CPSR_c ,R0;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域
加载/ 存储指令LDR
Load word
字数据加载指令
LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读入R0,并将新地址R1+
R2写入R1。
LDRB
Load byte
字节数据加载指令
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入R0,并将R0的高24
位清零
LDRH
Load half word
半字数据加载指令
LDRH R0,[R1];将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16
位清零
LDM
Load multiple
批量数据加载指令
LDMFD R13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)STR
Store
字数据存储指令
STR R0,[R1],#8 ;将R0中的字数据写入R1为地址的存储器中,并将新地址R1
+8写入R1
STRB
Store byte
字节数据加载存储指令
STRB R0,[R1,#8];将寄存器R0中的字节数据写入以R1+8为地址的存储器中STRH
Store half word
半字数据存储指令
STRH R0,[R1,#8];将寄存器R0中的半字数据写入以R1+8为地址的存储器中STM
Store multiple
批量数据存储指令
STMFD R13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,
LR)存入堆栈
数据交换SWP
Swap word
字数据交换指令
SWP R0,R1,[R2];R2所指的字数据传送到R0,同时R1的数据传送到R2所指的
单元
SWPB
Swap byte
字节数据交换指令
SWPB R0,R1,[R2] ;R2所指的字节数据传送到R0,R0高24位清零,同时R1低8
位送R2所指单元。
移位指令LSL
Logic shift left
逻辑左移操作MOV R0, R1, LSL#2(ASL#2);将R1中的内容左移两位后传送到R0中,低位用0
填充
ASL
Arithmetic shift left
算术左移操作
LSR
Logic shift right
逻辑右移操作
MOV R0, R1, LSR#2 ;将R1中的内容右移两位后传送到R0中,左端用零来填充ASR
Arithmetic shift right
算术右移操作
MOV R0, R1, ASR#2 ;将R1中的内容右移两位后传送到R0中,左端用第31位的值
来填充
ROR
Rotate right
循环右移操作
MOV R0, R1, ROR#2;将R1中的内容循环右移两位后传送到R0中
RRX
Rotate right extended
带拓展的循环右移操作
左端用进位标志位C来填充
协处理器CDP Data operations 协处理器数操作指令
LDC Load 协处理器数据加载指令
STC Store 协处理器数据存储指令
MCR Move to coproc fr ARM reg 处理器寄存器到协处理器寄存器的数据传送指令MRC M to ARM reg fr coprocessor 协处理器寄存器到处理器寄存器的数据传送指令
PSR
field F (Flags field mask byte) S (Stats field mask byte)
X (Extension field mask
byte)
C (control field mask byte)
CPSR 3
1
3
2
9
2
8
2
7
2
6
2
5
24
2
3
2
2
21
2
1
9
1
8
1
7
16 15
1
4
1
3
1
2
1
1
1
9 8 7 6 5 4 3 2 1 0
意义N Z C V Q DNZ (RAZ) 系统扩展用I F T M4 M3 M2 M1 M0
CPSR 各位详细意义
N 当前指令运算结果为负时,N = 1; 结果为非负时,N = 0 Z 运算结果为0,Z=1;否则Z=0
C 上溢出、进位C=1;下溢出、借位C=0
V 加减法V=1表示符号位溢出
I I=1时,禁止IRQ中断
F F=1时,禁止FIQ中断
T T=0,ARM指令;T=1,Thumb指令
M[4:0]
0b10000 User
0b10001 FIQ
0b10010 IRQ
0b10011 Supervisor
0b10111 Abort
0b11011 Undefined
0b11111 System
指令格式31
3
2
9
2
8
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
1
9
1
8
1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
9 8 7 6 5 4 3 2 1 0
Cond Opcode S Rn Rd Shift_operand
opcode 指令操作符编码
S 决定指令的操作是否影响CPSR的值
Rd 目标寄存器编码
Rn 包含第一个操作数的寄存器编码
Shift_opra
nd
表示第二个操作数
Cond 指令执行的条件编码,详细如下所示
条件域
EQ Z=1 Equal
NE Z=0 Not equal, or unordered
CS/HS C=1 Carry set / Unsigned higher or same
Great than or equal, or
unordered
CC/LO C=0 Carry clear / Unsigned lower Less than
MI N=1 Negative Less than
PL N=0 Positive or zero
Greater than or equal , or
unordered
VS V=1 Overflow Unordered
VC V=0 No overflow Not unordered
HI C=1且Z=0 Unsigned higher Greater than, or unordered LS C=0或Z=1 Unsigned lower or same Less than or equal
GE N=1且V=1 或N=0且V=0 Signed greater than or equal Greater than or equal
LT N=1且V=0 或N=0且V=1 Signed less than Less than , or unordered
GT Z=0或N=V Signed greater than Great than
LE Z=1或N!=V Signed less than or equal Less than or equal , or unordered
AL Always (normally omitted)
并行指令前缀S Signed arithmetic modulo 28 or 216 ,sets CPSR GE bit
Q Signed saturating arithmetic
SH Signed arithmetic, halving results
U Unsigned arithmetic modulo 28 or 216 ,sets CPSR GE bit UQ Unsigned saturating arithmetic
UH Unsigned arithmetic ,halving results
批量传输地址模式
Block load / store Stack pop / push
IA Increment after FD Full descending IB Increment before ED Empty descending DA Decrement after FA Full ascending DB Decrement before EA Empty ascending
ARM 指令寻址方式
立即寻址ADD R0,R0,#0x3f R0←R0+0x3f
寄存器寻址ADD R0,R1,R2 R0←R1+R2
间接寻址ADD R0,R1,[R2] R0←R1+[R2]
变址寻址
LDR R0,[R1,#4] R0←[R1+4]
LDR R0,[R1,#4]!R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 R0←[R1]、R1←R1+4
LDR R0,[R1,R2] R0←[R1+R2]
多寄存器寻
址
LDMIA R0,{R1,R2,R3,R4} R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]
伪指令及伪操作
符号定义
GBLA / LCLA 定义一个全局 / 局部的数字变量,并初始化为0
GBLL / LCLL 定义一个全局 / 局部的逻辑变量,并初始化为F(假)
GBLS / LCLS 定义一个全局 / 局部的字符串变量,并初始化为空
SETA / SETL / SETS 给一个数学 / 逻辑 / 字符串变量赋值
RLIST
对一个通用寄存器列表定义名称,访问次序为根据寄存器的编号由低到高,与排
列次序无关
数据定义
DCB(=)/ DCW(DCWU)分配一片连续的字节 / 半字存储单元并用指定的数据初始化
后缀U表示
不要求对
齐
DCFS(DCFSU)/DCFD(DCFDU)
分配一片连续的(单 / 双精度的浮点数)字存储单元并用指定的
数据初始化
DCQ(DCQU)/ DCD(DCDU)
用于分配一片以双字 / 字为单位的连续的存储单元并用指定的数
据初始化
DCDO 分配字内存但愿,初始化为标号基于静态基址寄存器R9的偏移量
DCI 和DCD类似,不同处在于DCI内存中的数据被标识为指令
SPACE(%)DataSpace SPACE 100 ;分配连续100字节的存储单元并初始化为0
MAP(^)MAP 0x100,R0 ;定义结构化内存表首地址的值为0x100+R0
FIELD(#) A FIELD 16 ;定义A的长度为16字节
控制伪指令
IF、ELSE、
ENDIF
IF 逻辑表达式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。
当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其
中,
ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行
指令序列1,否则继续执行后面的指令。
WHILE、WEND
WHILE 逻辑表达式
指令序列
WEND
WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。
当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再
判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
MACRO、MEND MEXIT MACRO
$标号宏名 $参数1,$参数
2,……指令序列
MEND
$标号在宏指令被展开时,标号会被替换为用户定义的符号,
宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。
MEXIT用于从宏定义中跳转出去
AREA
AREA 段名属性1,属性
2,……用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。
ALIGN AREA Init,CODE,ALIEN=3 指定后面的指令为8字节对齐
CODE CODE16、CODE32 指定指令序列为16位的Thumb指令或32位的ARM指令
ENTRY 在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY 时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY (可以没有)。
EQU(*)名称 EQU 表达式 {,类型} 为程序中的常量、标号等定义一个等效的字符名称
EXPORT EXPORT 标号
用于在声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL
代替。
IMPORT IMPORT 标号
用于通知编译器要使用的标号在其他的源文件中定义,无论当前源文件是否引用
该标号,该标号均会被加入到当前源文件的符号表中
EXTERN EXTERN 标号用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中
GET GET 文件名将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理
INCBIN INCBIN 文件名INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理
RN 名称RN 表达式RN伪指令用于给一个寄存器定义一个别名
ROUT {名称} ROUT
ROUT伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作为范围为当前ROUT和下一个ROUT之间。