【Cortex-A7】 常用汇编指令
- Cortex-A7 常用汇编指令
- 1. 处理器内部数据传输
- 2. 存储器访问指令
- 3. 压栈和出栈指令
- 4. 跳转指令
- 5. 算术运算指令
- 6. 逻辑运算指令
Cortex-A7 常用汇编指令
参考《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》的 A4
章节。
先运行汇编语言,从汇编语言跳转到C语言,解释:
cortex-A 芯片刚上电时, SP 指针还未初始化,C环境还未准备好。应该先用汇编语言设置好C环境,比如初始化 DDR ,设置 SP指针等。
- 堆栈:因为C语言的函数运行设计到出栈入栈等对堆栈的操作,堆栈由SP指针访问,上电SP指针还没有设置好的前提下,C代码是无法运行的
- 初始化DDR:还有些芯片本身没有RAM,或者内部的RAM不开放给用户使用,用户的代码需要在 DDR 中运行,因此汇编中还需要初始化 DDR
ARM 汇编 , GCC交叉编译器 ,代码要符合 GUN 语法。
1. 处理器内部数据传输
| 指令 | 目的 | 源 | 描述 |
|---|---|---|---|
| MOV | R0 | R1 | 将 R1 里面的数据复制到 R0 中。 |
| MRS | R0 | CPSR | 将特殊寄存器 CPSR 里面的数据复制到 R0 中。 |
| MSR | CPSR | R1 | 将 R1 里面的数据复制到特殊寄存器 CPSR 里中 |

2. 存储器访问指令
读写存储器时,需要先将存储器的地址放在寄存器中,再去操作寄存器
| 指令 | 描述 |
|---|---|
| LDR Rd, [Rn , #offset] | 从存储器 Rn+offset 的位置读取数据存放到 Rd 中。 |
| STR Rd, [Rn, #offset] | 将 Rd 中的数据写入到存储器中的 Rn+offset 位置。 |

3. 压栈和出栈指令
| 指令 | 描述 |
|---|---|
| PUSH | 将寄存器列表存入栈中。 |
| POP | 从栈中恢复寄存器列表 |

4. 跳转指令
| 指令 | 描述 |
|---|---|
| B | 跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W |
| BX | 间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集 |
| BL | 跳转到标号地址,并将返回地址保存在 LR 中。 |
| BLX | 结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地 址保存在 LR 中,切换指令集。 |


5. 算术运算指令
| 指令 | 计算公式 | 备注 |
|---|---|---|
| ADD Rd, Rn, Rm | Rd = Rn + Rm | 加法运算,指令为 ADD |
| ADD Rd, Rn, #immed | Rd = Rn + #immed | |
| ADC Rd, Rn, Rm | Rd = Rn + Rm + 进位 | 带进位的加法运算,指令为 ADC |
| ADC Rd, Rn, #immed | Rd = Rn + #immed +进位 | |
| SUB Rd, Rn, Rm | Rd = Rn – Rm | 减法 |
| SUB Rd, #immed | Rd = Rd - #immed | |
| SUB Rd, Rn, #immed | Rd = Rn - #immed | |
| SBC Rd, Rn, #immed | Rd = Rn - #immed – 借位 | 带借位的减法 |
| SBC Rd, Rn ,Rm | Rd = Rn – Rm – 借位 | |
| MUL Rd, Rn, Rm | Rd = Rn * Rm | 乘法(32 位) |
| UDIV Rd, Rn, Rm | Rd = Rn / Rm | 无符号除法 |
| SDIV Rd, Rn, Rm | Rd = Rn / Rm | 有符号除法 |
6. 逻辑运算指令
| 指令 | 计算公式 | 备注 |
|---|---|---|
| AND Rd, Rn | Rd = Rd &Rn | 按位与 |
| AND Rd, Rn, #immed | Rd = Rn &#immed | |
| AND Rd, Rn, Rm | Rd = Rn & Rm | |
| ORR Rd, Rn | Rd = Rd | Rn | 按位或 |
| ORR Rd, Rn, #immed | Rd = Rn | #immed | |
| ORR Rd, Rn, Rm | Rd = Rn | Rm | |
| BIC Rd, Rn | Rd = Rd & (~Rn) | 位清除 |
| BIC Rd, Rn, #immed | Rd = Rn & (~#immed) | |
| BIC Rd, Rn , Rm | Rd = Rn & (~Rm) | |
| ORN Rd, Rn, #immed | Rd = Rn | (#immed) | 按位或非 |
| ORN Rd, Rn, Rm | Rd = Rn | (Rm) | |
| EOR Rd, Rn | Rd = Rd ^ Rn | 按位异或 |
| EOR Rd, Rn, #immed | Rd = Rn ^ #immed | |
| EOR Rd, Rn, Rm | Rd = Rn ^ Rm |



















