文章目录
- [1. 算术指令](#1. 算术指令)
-
- [1.1 加法命令ADD\ADDS](#1.1 加法命令ADD\ADDS)
- [1.2 带进位加法命令ADC\ADCS](#1.2 带进位加法命令ADC\ADCS)
- 1.3减法命令SUB\SUBC
- 1.4带借位减法命令SBC\SBCS
- 2.逻辑运算指令
-
- 2.1逻辑与指令AND、ANDS
- 2.2位清零指令BIC
- 2.3逻辑或指令ORR\ORRS
- 2.4逻辑异或指令
- [2.5 逻辑左移LSL](#2.5 逻辑左移LSL)
- 2.6逻辑右移LSR
- 3.比较指令
- 4.移动指令
- 5.跳转指令
-
- [5.1 B指令](#5.1 B指令)
- [5.2 BL指令](#5.2 BL指令)
- [5.3 BX指令](#5.3 BX指令)
- [5.4 BLX指令](#5.4 BLX指令)
- [6. 加载/存储指令](#6. 加载/存储指令)
-
- [6.1 LDR\LDRB\LDRH指令](#6.1 LDR\LDRB\LDRH指令)
- [6.2 STR\STRB\STRH指令](#6.2 STR\STRB\STRH指令)
- [7. 批量数据加载/存储指令指令](#7. 批量数据加载/存储指令指令)
记录ARM V8 A32常用指令集。
调试时常用的汇编命令:ADD\SUB\MOV\LDR\STR\BL\CMP等命令
具体可以参考官方文档:DUI0801C_armasm_user_guide
1. 算术指令
1.1 加法命令ADD\ADDS
1.2 带进位加法命令ADC\ADCS
1.3减法命令SUB\SUBC
1.4带借位减法命令SBC\SBCS
2.逻辑运算指令
2.1逻辑与指令AND、ANDS
2.2位清零指令BIC
2.3逻辑或指令ORR\ORRS
2.4逻辑异或指令
2.5 逻辑左移LSL
移位进来值补0
2.6逻辑右移LSR
3.比较指令
3.1直接比较指令CMP
3.2负数比较指令CMN
4.移动指令
4.1MOV指令
4.2MVN指令
5.跳转指令
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:
使用专门的跳转指令。
直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:
B 跳转指令
BL 带返回的跳转指令
BLX 带返回和状态切换的跳转指令
BX 带状态切换的跳转指令
5.1 B指令
5.2 BL指令
5.3 BX指令
5.4 BLX指令
6. 加载/存储指令
6.1 LDR\LDRB\LDRH指令
备注:LDR R,label 和 LDR R,=label的区别
LDR 是ARM中的指令,也是伪指令。
当用 LDR r, =imd // r 为寄存器, imd为立即数
LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。
当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。
LDR r, label 和 LDR r, =label的区别:
LDR r, =label 会把label表示的值加载到寄存器中,而LDR r, label会把label当做地址,把label指向的地址中的值加载到寄存器中。
例如label的值是 0x8000, LDR r, =label会将 0x8000加载到寄存器中,而LDR r, label则会将内存0x8000处的值加载到寄存器中。
6.2 STR\STRB\STRH指令
7. 批量数据加载/存储指令指令
LDM 批量数据加载指令
STM 批量数据存储指令