ARM指令
一、环境
开发环境: Linux
汇编: GCC
二、指令
将遇到的一些指令放到这边,以提供参考,后面遇到不会的再继续添加。
指令 | 说明 | 举例 |
---|---|---|
.equ | 类似#define | .equ NVA 0x10000 |
.text | 声明下来的代码都是放在text段 | |
.align 4 | 变量的对齐宽度 | |
.thumb | 表示接下来的指令时thumb指令集 | |
.syntax unified | 统一汇编语法 | corteX-m3为了兼容thumb指今和thumb2指,使这两种指今可以使用统一的格式,引人了一种叫做”统一汇编语言UAL"的语法机制。简单来就是我们不用关心我们使用的是thumb指今是thumb2指令,而是统一使用32位thumb2指令的语法格式书写 |
.type xxx, %function | .type port_start, %function port_start: | |
cpsid i | 屏蔽可配置的优先级中断,等同primask = 1 | |
push | 压栈 | |
pop | 出栈 | |
ldr | 字数据加载指令 | ldr r0, = 50 ;立即数放到r0里面 ldr r0, [r1] ;r1地址中的数据放入r0 |
ldrb | 字节数据加载指令 | |
str | 字数据存储指令 | str r5,[r4] ;将r5寄存器中的值,存放到r4寄存器地址中 store from a register into memory |
strb | 字节数据存储指令 | |
add | 加法指令 | add r1,r1, #1 等同于:r1 = r1+1 |
sub | 减法指令 | sub r1,r1, #1 等同于:r1 = r1-1 |
subs | 等同于上面,但是会影响到标志寄存器xpsr | |
mov | 一般传送指令 | mov r1,#0 等同于 r1 = 0 |
msr | 用于将操作数的内容发送到程序状态寄存器的特定域中,操作数可以为通用寄存器或者立即数 | msr primask, r1 传送r1值得内容到primask中 |
bx | 指令跳转到指定的目标地址中,目标地址处指令既可以是ARM指令也可以是Thumb指令 | bx lr 返回子程序 |
cbz | 比较指令,如果为零就转移 | |
orr | 用于两个操作数上的逻辑或运算 | orr lr, lr, #0x04 lr 中的值与立即数0x04相或,结果存储到lr中 |
stm | 类似于str但是它的对象为一组寄存器 store from a register into memory | stm r0,{r4-r11} ;将r4-r11寄存器值保存到r0所指向的位置中 |
ldm | 类似于ldr但是它的对象为一块内存 store from amemory into register |
关于linux arm gcc内联汇编参考手册
linux arm gcc内联汇编参考手册
关于伪指令可以参考:
GCC编译环境下ARM汇编语法