1、 相对跳转指令:b、bl
其中bl除了跳转之外,还将返回地址保存在lr寄存器中。
这两条指令的可跳转范围是当前指令的前后32MB。
它们是位置无关的指令。
2、 数据传送指令mov,地址读取伪指令ldr
Mov指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器。示例如下:
Mov r1 ,r2 /*r1=r2*/ Mov r1 ,#4096 /*r1=4096*/ |
Mov指令传送的常数必须能用立即数来表示。
当不知道一个数能否用“立即数”来表示时,可以使用ldr命令来赋值。
Ldr是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令。
Ldr的本意为“大范围的地址读取伪指令”。
示例如下:
ldr r1 ,=4096 /*r1=4096*/ |
3、 内存访问指令:ldr、str、ldm、stm
Ldr指令从内存中读取数据到寄存器。Str指令把寄存器的值存储到内存中。它们操作的数据都是32位的。示例如下:
ldr r1 ,[r2,#4] /*将地址为r2+4的内存单元数据读取到r1中*/ ldr r1 ,[r2] /*将地址为r2的内存单元数据读取到r1中*/ ldr r1 ,[r2],#4 /*将地址为r2的内存单元数据读取到r1中,然后r2=r2+4*/ str r1 ,[r2,#4] /*将r1的数据保存到地址为r2+4的内存单元中*/ str r1 ,[r2] /*将r1的数据保存到地址为r2的内存单元中*/ str r1 ,[r2] ,#4 /*将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4*/ |
Ldm和stm属于批量内存访问指令,只用一条指令就可以读写多个数据。
4、 加减指令:add、sub
示例如下:
Add r1,r2,#1 /*表示r1=r2+1*/ Sub r1,r2,#1 /*表示r1=r2-1*/ |
5、 程序状态寄存器的访问指令:msr、mrs
ARM处理器有一个程序状态寄存器(cpsr),它用来控制处理器的工作模式、设置中断的总开关。示例如下:
Msr cpsr ,r0 /*复制r0到cpsr中*/ Mrs r0,cpsr /*复制cpsr到r0中*/ |
6、 其它伪指令
常见如下:
.extern main .text .global _start _start: |
“.extern”定义一个外部符号,上面的代码表示本文件中引用的main是一个外部函数。
“.text”表示下面的语句都属于代码段。
“.global”将本文件中的某个程序标号定义为全局的。
记:嵌入式linux应用开发完全手册---------读书笔记