您的位置 首页 报告

嵌入式Linux三常用ARM汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。ARM指令集可…

嵌入式开发中,汇编程序常常用于十分要害的当地,比方系统启动时初始化,进出中止时的环境保护,康复等对功能有要求的当地。

ARM指令集能够分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状况寄存器处理指令、协处理器指令和反常发生指令。
ARM指令运用的根本格局如下:
〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}
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。

bfuna
….
funa:
bfunb
….
funb:
….

2、数据传送指令mov,地址读取伪指令ldr
mov指令能够把一个寄存器的值赋给别的一个寄存器,或许把一个常数赋给寄存器。
movr1,r2
/*上面是r1=r2*/
movr1,#1024
/*r1=1024*/

mov传送的常数有必要能用当即数来一共。当不能用当即数一共时,能够用ldr指令来赋值。
ldr是伪指令,不是实在存在的指令,编译器会把它扩展成真实的指令;假如该常数能用“当即数”来一共,则运用mov指令,不然编译时将该常数保存在某个方位,运用内存读取指令把它读出来。
ldrr1,=1024
/*r1=1024*/

3、内存拜访指令ldr、str、ldm、stm
ldr既能够指低至读取伪指令,也能够是内存拜访指令。当他的第二个参数前面有=时标伪指令,不然表内存拜访指令。
ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。

ldrr1,[r2,#4]/*将地址为r2+4的内存单元数据读取到r1中*/
ldrr1,[r2]/*将地址为r2的内存单元数据读取到r1中*/
ldrr1,[r2],#4/*将地址为r2的内存单元数据读取到r1中,然后r2=r2+4*/
strr1,[r2,#4]/*将r1的数据保存到地址为r2+4的内存单元中*/
strr1,[r2]/*。。。。*/
strr1,[r2],#4/*将r1的数据保存到地址为r2的内存单元,然后r2=r2+4*/

多寄存器传送指令能够用一条指令将16个可见寄存器(R0~R15)的恣意子调集(或悉数)存储到存储器或从存储器中读取数据到该寄存器调集中。与单寄存器存取指令比较,多寄存器数据存取可用的寻址形式愈加有限。多寄存器存取指令的汇编格局如下:

LDM/STM{}Rn{!},

4、加减指令add、sub

addr1,r2,#1/*r1=r2+1*/
subr1,r2,#1/*r1=r2-1*/

5、程序状况寄存器的拜访指令msr,mrs

ARM指令中有两条指令,用于在状况寄存器和通用寄存器之间传送数据。修正状况寄存器一般是经过“读取-修正-写回”三个过程的操作来完成的。这两条指令分别是:
状况寄存器到通用寄存器的传送指令(MRS)
通用寄存器到状况寄存器的传送指令(MSR)

其汇编格局如下:
MRS{}Rd,CPSR|SPSR
其汇编格局如下:
MSR{}CPSR_f|SPSR_f,#<32-bitimmediate>
MSR{}CPSR_|SPSR_,Rm

msrcpsr,r0/*r0到cpsr中*/
mrsr0,cpsr/*cpsr到r0中*/

6、逻辑运算指令

AND逻辑"与"操作指令
指令格局:
AND{cond}{S}Rd,Rn,operand2

AND指令将操作数operand2与Rn的值按位逻辑"与",成果寄存到意图寄存器Rd中。若设置S,则依据运算成果影响N、Z位,在核算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC对标志位的影响同AND指令)。

指令示例:
ANDSR1,R1,R2;R1=R1&R2,并依据运算的成果更新标志位
ANDR0,R0,#0x0F;R0=R0&0x0F,取出R0最低4位数据。

ORR逻辑"或"操作指令
指令格局:ORR{cond}{S}Rd,Rn,operand2ORR指令将操作数operand2与Rn的值按位逻辑"或",成果寄存到意图寄存器Rd中。指令示例:
ORRSR1,R1,R2;R1=R1|R2,并依据运算的成果更新标志位

ORRR0,R0,#0x0F;R0=R0|0x0F,将R0最低4方位1,其他位不变。

BIC位铲除指令
指令格局:
BIC{cond}{S}Rd,Rn,operand2

BIC指令将Rn的值与操作数operand2的反码按位逻辑"与",成果寄存到意图寄存器Rd中。指令示例:BICR0,R0,#0x0F;将R0最低4位清零,其他位不变。

7、反常中止指令
反常中止指令能够分为一下两种:
软件中止指令(SWI)
断点指令(BKPT—仅用于v5T系统)
软件中止指令SWI用于发生SWI反常中止,用来完成在用户形式下对操作系统中特权形式的程序的调用;断点中止指令BKPT首要用于发生软件断点,供调试程序用。

8、其他伪指令

.externmain
.text
.global_start
_start:

.extern界说一个外部符号(能够是变量也能够是函数),上面的代码一共表文本文件中引证的main是一个外部函数。

.text一共下面的查办都归于代码段

.global将本文件中的某个程序标号界说为大局的,如‘_start’便是个大局函数

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/264028.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部