首页 > 代码库 > ARM指令集

ARM指令集

ARM处理器指令集主要有 6大类:

  • 跳转指令
  • 数据处理指令
  • 程序状态寄存器 (PSR) 处理指令
  • 加载/存储指令
  • 协处理器指令
  • 异常产生指令
指令指令功能
ADC带进位加法
ADD加法
AND逻辑与
B跳转
BIC位清零
BL带返回的跳转
BLX带返回和状态切换的跳转
BX带状态切换的跳转
CDP协处理器数据操作
CMN比较反值
CMP比较
EOR异或
LDC存储器到协处理器的数据传输
LDM加载多个寄存器
LDR存储器到寄存器的数据传输
MCR从 ARM 寄存器到协处理器寄存器的数据传输
MLA乘加运算
MOV数据传送
MRC从协处理器寄存器到ARM寄存器的数据传输
MRS传送 CPSR 或 SPSR 的内容到通用寄存器
MSR传送通用寄存器到 CPSR 或 SPSR 的
MUL32位乘法
MVF传送值到浮点数寄存器
MVN数据取反传送
ORR逻辑或
RSB逆向减法
RSC带借位的逆向减法
SBC带借位减法
STC协处理器寄存器写入存储
STM批量内存字写入
STR寄存器到存储器的数据传输
SUB减法
SWI软件中断
TEQ相等测试
TST位测试
  

 

ARM 指令寻址方式
 
 
 
1、立即数寻址
操作数就在指令中给出,只要取出指令也就取到了操作数,这个操作数被成为立即数。
ADD R0, R0, #1 ; R0 <- R0 + 1
ADD R0, R0, #0x3A ; R0 <- R0 + 0x3A

上面指令中,第 2 个源操作数为立即数。

2、寄存器寻址
寄存器寻址,即利用寄存器中的数值作为操作数。
ADD R0, R1, R2 ; R0 <- R1 + R2

该指令将寄存器 R1 和 R2 的内容想家,结果存在 R0 中。

3、寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
ADD R0, R1, [R2] ; R0 <- R1 + [R2]
LDR R1, [R1] ; R0 <- [R1]
第 1 条指令,以寄存器 R2 的内容作为操作数的地址,然后与 R1 相加,其结果存入寄存器 R0 中。
第 2 条指令,以 R1 的值为地址的寄存器中的内容送到 R0 中。

4、基址变址寻址
基址变址的寻址方式就是将寄存器 ( 该寄存器一般称作基址寄存器 )的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。

LDR R0, [R1, #0x0A] ; R0 <- [R1 + 0x0A]
LDR R0, [R1, #0x0A]! ; R0 <- [R1 + 0x0A] , R1 <- R1 + 0x0A

第 1 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中。
第 2 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中,最后 R1 + 0x0A 的值还存往 R1中,R1得到更新。

5、多寄存器寻址
多寄存器寻址,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令玩成传送最多 16 个通用寄存器的值。

LDMIA R0, {R1, R2, R3,R4} ; R1 <- [R0]
; R2 <- [R0 + 4]
; R3 <- [R0 + 8]
; R4 <- [R0 + 12]

该指令的后缀 IA 是“ Increment After ” 之意,表示每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1~R4 。

6、相对寻址
与基址寻址方式相似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加后得到的操作数作为有效地址。
BL NEXT ; 跳转到子程序 NEXT 处执行
... ...
NEXT
... ...
MOV PC, LR ; 从子程序返回


7、堆栈寻址
根据堆栈的生成方式,堆栈分为递增堆栈 (Ascending Stack),和递减堆栈 (Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有 4 种堆栈工作方式:
(1) 满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2) 满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(2) 空递增堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
(3) 空递减堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

ARM指令集