首页 > 代码库 > 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 的 |
MUL | 32位乘法 |
MVF | 传送值到浮点数寄存器 |
MVN | 数据取反传送 |
ORR | 逻辑或 |
RSB | 逆向减法 |
RSC | 带借位的逆向减法 |
SBC | 带借位减法 |
STC | 协处理器寄存器写入存储 |
STM | 批量内存字写入 |
STR | 寄存器到存储器的数据传输 |
SUB | 减法 |
SWI | 软件中断 |
TEQ | 相等测试 |
TST | 位测试 |
ARM 指令寻址方式
1、立即数寻址
操作数就在指令中给出,只要取出指令也就取到了操作数,这个操作数被成为立即数。
上面指令中,第 2 个源操作数为立即数。
2、寄存器寻址
寄存器寻址,即利用寄存器中的数值作为操作数。
该指令将寄存器 R1 和 R2 的内容想家,结果存在 R0 中。
3、寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
ADD R0, R1, [R2] ; R0 <- R1 + [R2]
LDR R1, [R1] ; R0 <- [R1]
第 1 条指令,以寄存器 R2 的内容作为操作数的地址,然后与 R1 相加,其结果存入寄存器 R0 中。
第 2 条指令,以 R1 的值为地址的寄存器中的内容送到 R0 中。
4、基址变址寻址
基址变址的寻址方式就是将寄存器 ( 该寄存器一般称作基址寄存器 )的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
第 1 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中。
第 2 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中,最后 R1 + 0x0A 的值还存往 R1中,R1得到更新。
5、多寄存器寻址
多寄存器寻址,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令玩成传送最多 16 个通用寄存器的值。
该指令的后缀 IA 是“ Increment After ” 之意,表示每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1~R4 。
6、相对寻址
与基址寻址方式相似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加后得到的操作数作为有效地址。
7、堆栈寻址
根据堆栈的生成方式,堆栈分为递增堆栈 (Ascending Stack),和递减堆栈 (Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有 4 种堆栈工作方式:
(1) 满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2) 满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(2) 空递增堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
(3) 空递减堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
操作数就在指令中给出,只要取出指令也就取到了操作数,这个操作数被成为立即数。
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指令集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。