ARM指令
1. ARM指令集
1.1 数据处理指令
助记符 |
操作 |
助记符 |
操作 |
MOV |
数据传送 |
AND |
逻辑与 |
MVN |
数据取反传送 |
ORR |
逻辑或 |
ADD |
加 |
EOR |
逻辑异或 |
ADC |
带进位的加 |
BIC |
位清零 |
SUB |
减 |
CMP |
比较 |
SBC |
带借位的减 |
CMN |
相反数比较 |
RSB |
逆向减 |
TST |
位测试 |
RSC |
带借位逆向减 |
TEQ |
测试相等 |
MOV R0, #0xFF
MOV R0, R0
MOV R0, R0, LSL#3
MOV PC, R14
MOVS PC, R14
MVN R0, #4
MVN R0, #0
ADD R0, R1, R2
ADD R0, R1, #0xFF
ADD R0, R2, R3, LSL#1
ADDS R0, R4, R8
ADCS R1, R5, R9
ADCS R2, R6, R10
ADCS R3, R7, R11
SUB R0, R1, R2
SUB R0, R1, #0xFF
SUB R0, R2, R3, LSL#1
SUBS R0, R0, R2
SBCS R1, R1, R3
RSB R2, R0, #0xFF
RSBS R2, R0, #0
RSC R3, R1, #0
AND R0, R0, #0x03
AND R2, R1, R3
AND R0, R0, #0x01
ORR R0, R0, #0x03
ORR R0, R0, #0x0F
EOR R0, R0, #0x03
EOR R1, R1, #0x0F
EOR R2, R1, R0
EORS R0, R5, #0x01
BIC R0, R0, #0x1011
BIC R1, R2, R3
CMP R1, #10
CMP R1, R2
CMN R0, #1
TST R0, #1
TEQ R0, R1
1.2 乘法指令
助记符 |
操作 |
助记符 |
操作 |
MUL |
乘(保留32位结果) |
UMLAL |
无符号数长乘–累加 |
MLA |
乘(32位结果) |
SMULL |
有符号数长乘 |
UMULL |
无符号数长乘 |
SMLAL |
有符号数长乘–累加 |
MUL R1, R2, R3
MULS R0, R3, R7
MLA R1, R2, R3, R0
UMULL R0, R1, R5, R8
UMLAL R0, R1, R5, R8
SMULL R2, R3, R7, R6
SMLAL R2, R3, R7, R6
1.3 跳转指令
助记符 |
操作 |
助记符 |
操作 |
B |
跳转 |
BL |
带返回的连接跳转 |
BX |
跳转并切换状态 |
BLX |
带返回的跳转并切换状态 |
B LABLE
B 0x1234
BL func
BX R14
1.4 Load/Store指令
助记符 |
操作 |
助记符 |
操作 |
LDR |
把存储器中的一个字装入寄存器 |
LDRBT |
用户模式下将一个字节装入寄存器 |
STR |
将寄存器中的字保存到存储器 |
STRBT |
用户模式下将寄存器中的低8位字节保存到存储器 |
LDRB |
把一个字节装入一个寄存器 |
LDRT |
用户模式下把一个字装入寄存器 |
STRB |
将寄存器中的低8位字节保存到存储器 |
STRT |
用户模式下将存储器中的字保存到寄存器 |
LDRH |
把一个半字装入一个寄存器 |
LDRSB |
把一个有符号字节装入寄存器 |
STRH |
将寄存器中的低16位半字保存到存储器 |
LDRSH |
把一个有符号半字装入寄存器 |
LDR R1, [R0, #0x12]
LDR R1, [R0, R2, LSL#2]
LDR Rd, [Rn], #0x04
STR R1, [R0]
助记符 |
操作 |
助记符 |
操作 |
LDM |
装载多个寄存器 |
STM |
保存多个寄存器 |
LDMIA R0!, {
R3~R9}
STMIA R1!, {
R3~R9}
STMFD SP!, {
R0~R7, LR}
LDMFD SP!, {
R0~R7, PC} ^
助记符 |
操作 |
助记符 |
操作 |
SWP |
字交换 |
SWPB |
字节交换 |
SWP R1, R1, [R0]
SWPB R1, R2, [R0]
1.5 状态寄存器传输指令
助记符 |
操作 |
助记符 |
操作 |
MRS |
把程序状态寄存器(PSR)的值送到通用寄存器 |
MSR |
把通用寄存器的值送到PSR或把一个立即数送到PSR |
MRS R1, CPSR
MRS R2, SPSR
MSR CPSR_c, 0xD3
MSR CPSR_cxsf, R3
1.6 协处理指令
助记符 |
操作 |
助记符 |
操作 |
CDP |
协处理器数据操作 |
MRC |
从协处理器寄存器传数据到ARM寄存器 |
LDC |
装载协处理器寄存器 |
STC |
存储协处理器寄存器 |
MCR |
从ARM寄存器传数据到协处理器寄存器 |
|
|
1.7 异常产生指令
助记符 |
操作 |
助记符 |
操作 |
SWI |
软中断指令 |
BKPT |
断点中断指令 |
SWI 0
SWI 0x123456
2. ARM指令的寻址方式
2.1 数据处理指令操作数的寻址方式
ARM数据处理指令的基本语法格式如下示:
<opcode> {<cond>} {S} <Rd>, <Rn>, <shifter_operand>
- 立即数寻址:指令中的第二操作数<shifter_operand>是立即数
MOV R0, #0
ADD R3, R3, #1
CMP R7, #1000
BIC R9, R8, #0xff00
- 寄存器寻址:指令中的第二操作数<shifter_operand>是寄存器中的值
MOV R2, R0
ADD R4, R3, R2
CMP R7, R8
- 寄存器移位寻址:指令中的第二操作数<shifter_operand>是由寄存器中的值移位得到
ADD R2, R0, R1, LSR#5
MOV R1, R0, LSL#1
RSB R9, R5, R5, LSL#1
2.2 字及无符号字节的Load/Store指令的寻址方式
- 寄存器间接寻址:将地址放在一个通用寄存器中,即所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器中的值为操作数的地址指针。寄存器间接寻址字及无符号字节的Load/Store指令语法格式如下示:
LDR|STR {<cond>} {B} {T} <Rd>, [Rm]
LDR R1, [R2]
STR R1, [R2]
- 基址变址寻址:是将基地址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址变址寻址的Load/Store指令语法格式如下示
LDR|STR {<cond>} {B} {T} <Rd>, [Rm, ±<addressing_mode>]
LDR R1, [R0, #0x0f]
STR R1, [R0, #-2]
STR R1, [R0, +R2]
2.3 批量Load/Store指令的寻址方式
- 多寄存器/块拷贝寻址:将一片连续内存单元的数据加载到通用寄存器组中或将一组通用寄存器的数据存储到连续的内存单元中。该类的指令语法格式如下示:
LDM|STM {<cond>} <addressing_mode> <Rn> { ! }, < registers/>< ^/>
STMIA R0!, {
R1-R7}
STMIB RO!, {
R1-R7}
STMDA R0!, {
R1-R7}
STMDB RO!, {
R1-R7}
- 堆栈操作寻址方式:对于堆栈的操作,数据写入内存和从内存中读出要使用不同的寻址模式,因为进栈操作和出栈操作要在不同的方向上调整堆栈操作
根据不同的寻址方式,堆栈可分为:Full栈、Empty栈、递减栈、递增栈
根据堆栈的不同种类,寻址方式可分为:满递减FD、空递减ED、满递增FA、空递增EA
2.4 相对寻址
相对寻址是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。有 B 和 BL 指令
BL FUN1
B LOOP