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

发布者:一条属马的龙最新更新时间:2016-05-10 来源: eefocus关键字:嵌入式  Linux  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。
 
b funa
....
funa:
    b funb
....
funb:
....

 
2、数据传送指令mov,地址读取伪指令ldr
mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。
mov r1, r2
/*上面是r1 = r2*/
mov r1,#1024
/*r1 = 1024*/

mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。
ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
ldr r1, = 1024
/*r1 = 1024*/

 

3、内存访问指令 ldr、str、ldm、stm
ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。
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]/*。。。。*/
str r1, [r2],#4/*将r1的数据保存到地址为r2的内存单元,然后r2= r2+4*/
 

多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下:

LDM/STM{}  Rn{!},  

 

4、加减指令 add、sub

add r1, r2, #1 /*r1=r2+1*/
sub r1, r2, #1 /*r1=r2-1*/

 

5、程序状态寄存器的访问指令msr,mrs

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

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

msr cpsr, r0 /*r0到cpsr中*/
mrs r0, cpsr /*cpsr到r0中*/

 

 

6、逻辑运算指令

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

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

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

ORR逻辑"或"操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑"或",结果存放到目的寄存器Rd 中。指令示例: 
ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位

ORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。 

 

BIC位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2 

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

 

7、异常中断指令
异常中断指令可以分为一下两种:
软件中断指令(SWI)
断点指令(BKPT—仅用于v5T体系)
软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT主要用于产生软件断点,供调试程序用。

 

8、其他伪指令

.extern main
.text
.global _start
_start:

'.extern' 定义一个外部符号(可以是变量也可以是函数),上面的代码表示表文本文件中引用的main是一个外部函数。

'.text'表示下面的语句都属于代码段

'.global'将本文件中的某个程序标号定义为全局的,如‘_start’就是个全局函数

关键字:嵌入式  Linux  ARM  汇编指令 引用地址:嵌入式Linux三常用ARM汇编指令

上一篇:arm指令集 从汇编开始
下一篇:ARM指令集详解

推荐阅读最新更新时间:2024-03-16 14:53

AVR单片机汇编指令的小合集
目前在学AVR,主要还是以C为主,但是也希望能懂一些汇编的语句,就找了一些常用语句,一起记忆。 一、算术和逻辑指令 1、加法指令 不带进位位加法:ADD Rd,Rr 带进位位加法:ADC Rd,Rr 字加立即数:ADIW Rdl,K 增1指令:INCRd 2、减法指令 不带进位位减法:SUB Rd,Rr 减立即数(字节):SUBI Rd,K 带进位位减法SBC :Rd,Rr 带进位位减立即数(字节):SBCI Rd,K 减立即数(字):SBIW Rdl,K 减1指令:DECRd 3、取反码指令 COM Rd 4、取补码指令 NEG Rd 5、比较指令 寄存器比较:CP Rd,Rr 带进位比较:CPC Rd,Rr 与立即数(字节
[单片机]
基于ARM44B0x的信号发射机控制器设计与实现
1.前言 船舶上使用的信号发射机是连续工作的,所以需要一个控制器对发射机的工作状态进行监控,常见的是用单片机作控制器的内核,但由于32位微处理器具有更好的精度和可靠性且低成本低功耗,所以在工业控制领域的应用日益广泛。采用嵌入式的32位微处理ARMS3C44B0x作为控制器的内核,设计的控制器将比用单片机作内核的处理器具有更全面的功能和更好的使用性能。 发射机控制器的主要功能是对多路模拟量和开关量的数据采集和处理监控发射机的工作状态;控制器控制发射机同时控制器又受上位机的控制,它要能在任意时刻准备好接收从上位机串口、网口发来的数据,它们之间的相对关系如图: 图1 控制器系统结构图 上位机向控制器发送数据从而实现对控
[单片机]
基于<font color='red'>ARM</font>44B0x的信号发射机控制器设计与实现
嵌入式Linux下基于MiniGUI的GIS实现
1 引言 随着软硬件资源的成熟与完善,嵌入式技术的应用越来越广泛,而开放源码的Linux操作系统成为开发嵌入式产品的首选。MiniGUI是一个适用于嵌入式系统的、功能强大的、轻量级的图形用户界面支持系统,它具有占用资源少、高性能、高可靠性及可配置的特点,已经成功移植到多种硬件和操作系统平台上。我们利用MiniGUI在Linux上实现了一个嵌入式GIS,它能实现地图的显示、放大、缩小、漫游等基本功能。 2、MiniGUI的特点和体系结构 2.1 MiniGUI的特点 与其它针对嵌入式产品的图形系统相比,MiniGUI具有以下一些技术优势: 1)遵循GPL条款的纯自由软件。 2)多字符集和多字体支持
[单片机]
<font color='red'>嵌入式</font><font color='red'>Linux</font>下基于MiniGUI的GIS实现
ARM linux上使用usb接口的触屏
应公司需要,在现有设备上面要使用触摸屏,显示器的尺寸是15寸,于是自己从淘宝上面买了个15寸4线电阻屏回来,带Windows下的驱动,售后告诉我不支持Linux。在pc上面使用很不错。接下来的任务是用到ARM开发板上面。 当把4根线,直接连接到开发板上面,为电阻屏预留的4个AD上面后,确实能够使用,不过鼠标并不能实时跟随触屏,会有跳动,而且在左侧区域按下后,鼠标跟随过来,当松开触摸屏后,鼠标并没有固定在按下的区域,而是回到右侧区域,类似于回到原点一样。触摸屏的最还没有反映,但是在Windows下触屏是没有问题的。查看了内核的AD输出结果,看不出来什么原因,不得已只好放弃。 在Windows下的驱动文件中找到了一份使用手册,里面介绍
[单片机]
在<font color='red'>ARM</font> <font color='red'>linux</font>上使用usb接口的触屏
ARM体系结构之点亮LED灯
首先看看我的板子,(s3c2440) 可以看出,要使LED灯管亮,只要将nLED1置为低电平即可,就是将对应的GPIO引脚置为低电平。 从上面两幅图可以发现,LED1、LED2、LED4对应着S3c2440的GPF端口,于是,通过查询手册 可以知道对应寄存器的地址。于是可以开始编程了 .text .global _start _start: @将GPF配置为输出引脚 LDR R0, =0x56000050 MOV R1, #0x00005500 STR R1, @输出低电平 LDR R0, =0x56000054 MOV R1, #0x00000050 STR R1, MAIN_LOOP
[单片机]
<font color='red'>ARM</font>体系结构之点亮LED灯
嵌入式智能平台在智能家居中的运用
家,作为人们最重要的一个生活场所,在人的生活中起着无可替代的作用,在外辛劳一天,回到家中,舒适、美观的家庭环境能给人们放松绷紧一天的神经,带来愉悦的心情。 当今社会,随着生活质量的日益改善和生活节奏的不断加快,人们的工作、生活日益信息化。信息化社会改变了人们的生活方式与工作习惯,使得家居系统的智能化成为一种消费需求,智能家居系统越来越被重视。因此,将家庭中各种通信设备、家用电器和家庭安保装置通过家居控制系统进行整合,并进行远程控制和管理,已经成为近年来一个热门研究课题。 迄今为止,智能家居还没有一个普遍认同的统一的定义。通常智能家居系统利用先进的计算机和网络通讯技术将与家居生活有关的各种各样的子系统,通过特定的网络有机地结合在一
[嵌入式]
ARM9与FPGA并口通信的实现
并口通信是最常用基础功能,实现ARM9与FPGA的并口通信有两种方式,一种颇为巧妙,利用SMC(Static Memory Controllor),其中的使能点都通过寄存器可以轻松控制;另一种方式就是通过GPIO来完成。 由于我拿到板子硬件的DRAM_CSN0、DRAM_WEN和DRAM_RDN在前期PCB设计时没有充分考虑过SMC可能被使用,故使用接插件上其他引脚进行代替,使用了图1中画圈的三根引脚SPI0_MOSI、SPI0_SCK、SPI0_CS。因为这三根引脚可以复用为GPIO,所以在并口调试中将这三根引脚当作GPIO来使用。 图1 图2 图3 表1 原SPI功能 GPIO FPGA引脚 功能
[单片机]
一种基于ARM和FPGA的嵌入式高速图像采集存储系统设计与实现
现代化生产和科学研究对图像采集系统要求日益提高。传统图像采集系统大都是基于PC机上,而在一些特殊的场合,尤其是在实时性要求较高时,普通的PC机显然无法满足应用要求。它主要包括图像采集模块、图像处理模块以及图像存储模块等。 1 系统结构及工作原理 本系统的结构模型,如图1所示。图像采集模块负责采集原始图像,并将原始图像数据送给FPGA,采用了可编程视频输入处理器SAA7113H。一帧图像采集完成后,ARM将图像数据通过FPGA取出,进行必要的处理,并形成图片文件存到CF卡中,本系统选用了Philips公司的LPC2214。 图像采集芯片将原始图像数据传到FPGA,FPGA将图像原始数据暂存于SRAMl中,当一帧图像存储
[工业控制]
一种基于<font color='red'>ARM</font>和FPGA的<font color='red'>嵌入式</font>高速图像采集存储系统设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved