1.02.1 ARM汇编指令集

mov r1,r0; @两个寄存器之间数据传输
mov r1,#0xff @将立即数赋值给寄存器

mvn和mov用法一样,区别是mov是原封不动的传递, 而mvn是按位取反后传递。
按位取反的含义:
比如: r1 = 0x000000ff,然后mov r0,r1后,r0 = 0xff 但是我mvn r0,r1后,r0=0xffffff00

常用ARM指令2:cpsr访问指令
常用mrs&msr
mrs用来读psr,msr用来写psr
CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。
cpsr和spsr的区别和联系:
cpsr是程序状态寄存器,整个SOC中只有1个;而spsr有5个,分别在5中异常模式下,作用是当从普通模式进入异常模式时,用来保存之前普通模式下的cpsr的,以在返回普通模式时恢复原来的cpsr。
常用ARM指令3:跳转(分支)指令
b & bl & bx
b 直接跳转(就没打算返回,常用于绝对跳转)
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用
bx 跳转同时切换到ARM模式,一般用于异常处理的跳转。
常用ARM指令4:访存指令
ldr/str & ldm/stm & swp

单个字/半字/字节访问 ldr/str
多字批量访问 ldm/stm
swp r1, r2, [r0]
swp r1, r1, [r0]

协处理器和协处理器指令

协处理器cp15操作指令
mcr & mrc

mrc用于读取CP15中的寄存器
mcr用于写入CP15中的寄存器

常用gnu伪指令
.global _start @ 给_start外部链接属性
.section .text @ 指定当前段为代码段
.ascii .byte .short .long .word
.quad .float .string @ 定义数据
.align 4 @ 以16字节对齐
.balignl 16 0xabcdefgh @ 16字节对齐填充
.equ @ 类似于C中宏定义
.end @标识文件结束
.include @ 头文件包含
.arm / .code32 @声明以下为arm指令
.thumb / .code16 @声明以下为thubm指令

ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作

ARM中有一个ldr指令,还有一个ldr伪指令
一般都使用ldr伪指令而不用ldr指令

猜你喜欢

转载自blog.51cto.com/14762640/2487323