|
常用ARM汇编指令
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”将本文件中的某个程序标号定义为全局的。
ARM汇编STR和LDR
1.使用单一数据传送指令(STR 和 LDR)来装载和存储单一字节或字的数据从/到内
存。
请问装载(LDR)和存储(STR)有什么区别?我个人理解没有区别.就是向指定的地址写数
据.是么?
LDR是内存数据放到寄存器,即装载,是读
STR是寄存器数据到内存,即存储,是写
2.ldr r0, PtEBIBase
对于这条指令中的PtEBIBase,它是一个地址么?可是它之前的定义是:
PtEBIBase:
.long EBI_BASE
PtEBIBase是一个标号,指向一个long型的数,这个数的值等于EBI_BASE,就是EBI的
基地址
3.ldr r1, [pc,#-(8+.-InitTableEBI)]
#-(8+.-InitTableEBI)这个东西如何计算?比如:
InitTableEBI是一个标号
8 + 当前地址 = 当前PC
8 + 当前地址 - InitTableEBI = 当前PC到InitTableEBI这个标号(即地址)的距
离。
pc - (8 + 当前地址 - InitTableEBI) = InitTableEBI这个标号的地址。
就是说,最后r1的值是InitTableEBI这个标号的地址。
|
|