指令格式: 指令{条件}{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 位测试指令 | TSTR1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 | |
TEQ | Test equivalence 相等测试指令 | TEQR1,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 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 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 | |
| |