ARM汇编指令基于RISC架构,因此其指令集非常精简,本文重点介绍必须掌握的相关指令。
1.算数和逻辑指令
mov 指令: mov r0, #1 @ 0x1 ---> r0
mvn指令:mvn r0, #0 @0x0取反 ---> r0
add指令: add r0, r1, r2 @ r0 = r1 + r2
sub指令: sub r0, r1, r2 @ r0 = r1 - r2
and指令: and r0, r1, r2 @ r0 = r1 & r2
bic指令: bic r0, r0, #0b1011 @ 用掩码清零r0,存入r0
2.比较指令
cmp指令: cmp r0, r1 @根据r0-r1值判断状态寄存器(cpsr寄存器)
tst指令: tst r0, #0b1001 @按位与的值判断状态寄存器(cpsr寄存器)
3.跳转指令
b指令: b label @直接跳转
bgt label1 @大于跳转
beq @等于跳转
bl指令: bl func @调用函数跳转(长跳转)
4.位移指令
lsl指令: mov r0, r0, lsl#2 @r0寄存器值算数左移2位
ror指令: mov, r0, r0,ror#1 @r0循环右移1位
5.程序状态指令
msr指令: mrs r0,cpsr @cpsr复制到msr
mrs指令: msr cpsr, r0 @r0复制到cpsr
6.存储器访问指令(如:内存)
ldr指令: ldr r0, [r1] @ r1内存地址到r0
ldr r0, [r1, #1]
str指令: str r0, [r1] @r0到r1内存地址
str r0, [r1, #1]
7.伪指令
伪指令并没有对应的机器码,是给汇编器看的,在编译时候起作用或者转换成其他指令。
(1)定义类伪指令
gobal:定义全局符号
例如:
.global _start
_start:
<汇编代码>
ascii:ascii数据类型
byte:byte数据类型
word:word数据类型
data:定义数据段
例如:
.data
hello:
.asicc "helloworld"
world:
.byte 0x1
equ:相当于c语言的define,例如:.equ NUM 0x12
align:数据对齐,例如: .align 4 @表示4字节对齐
(2)操作类伪指令
nop:空操作,其作用是延时
ldr:由于mov指令的立即数,不能超过8bit,所以需要使用ldr伪指令。
例如:
ldr r0, =0x2ff @立即数前加=号,不是#号
8.协处理器
协处理器用于执行特定的处理任务,如:数学协处理器用于数字处理,以减轻cpu负担,ARM可以多达16个协处理器,其中CP15是最重要的协处理器。CP15主要通过协处理器寄存器进行访问。其实在x86系列处理器中,x87浮点单元,就是一个协处理器。
mcr指令:通用寄存器--->协处理器
mrc指令: 协处理器--->通用寄存器
例如:
mrc p15,0,r0,c0,c0,0 @读取main id寄存器到r0