在嵌入式开发中,汇编程序常常用于十分要害的当地,比方系统启动时初始化,进出中止时的环境保护,康复等对功能有要求的当地。
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’便是个大局函数