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