常用ARM汇编指令
ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。
ARM指令使用的基本格式如下:
〈opcode〉{〈cond〉}{S}
opcode 操作码;指令助记符,如LDR、STR等。
cond 可选的条件码;执行条件,如EQ、NE等。
S 可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。
Rd 目标寄存器。
Rn 存放第1操作数的寄存器。
operand2 第2个操作数
arm的寻址方式如下:
立即寻址
寄存器寻址
寄存器间接寻址
基址加偏址寻址
堆栈寻址
块拷贝寻址
相对寻址
这里不作详细描述,可以查阅相关文档。
数据处理指令
Load/Store指令
程序状态寄存器与通用寄存器之间的传送指令
转移指令
异常中断指令
协处理器指令
在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。
1、相对跳转指令:b、bl
这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。
这两条指令的可跳转范围是当前指令前后32M。
b funa
....
funa:
....
funb:
....
2、数据传送指令mov,地址读取伪指令ldr
mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。
mov r1, r2
mov r1,#1024
mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。
ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
ldr r1, = 1024
3、内存访问指令 ldr、str、ldm、stm
ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有=时标伪指令,否则表内存访问指令。
ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。
ldr r1,[r2]
ldr r1,[r2], #4
str r1 ,[r2, #4]
str r1, [r2]
str r1, [r2],#4
寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下:
LDM/STM{
4、加减指令 add、sub
add r1, r2, #1
sub r1, r2, #1
5、程序状态寄存器的访问指令msr,mrs
ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是:
状态寄存器到通用寄存器的传送指令(MRS)
通用寄存器到状态寄存器的传送指令(MSR)
其汇编格式如下:
MRS{
其汇编格式如下:
MSR{
MSR{
msr cpsr, r0
mrs r0, cpsr
6、异常中断指令
异常中断指令可以分为一下两种:
软件中断指令(SWI)
断点指令(BKPT—仅用于v5T体系)
软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT主要用于产生软件断点,供调试程序用。
7、其他伪指令
.extern main
.text
.global _start
_start:
.extern 定义一个外部符号(可以是变量也可以是函数),上面的代码表示表文本文件中引用的main是一个外部函数。
.text表示下面的语句都属于代码段
.global将本文件中的某个程序标号定义为全局的,如‘_start’就是个全局函数
ARM汇编指 相关文章:
- ARM汇编指令的一些总结(11-28)
- 第1天-ARM汇编指令ADD/SUB/MUL(11-26)
- 第1天-ARM汇编指令CMP/CMN/TST/TEQ(11-26)
- 第1天-ARM汇编指令B/BL(11-26)
- 第1天-ARM汇编指令MOV/MVN(11-26)
- 第1天-ARM汇编指令LSL/LSR/ASL/ASR(11-26)