常用ARM汇编指令

时间:2020-12-08 00:56:44

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应用开发完全手册---------读书笔记