ARM Cortex-M3 学习笔记(4-2)

发布者:ananan一二三四五最新更新时间:2016-05-05 来源: eefocus关键字:ARM  Cortex-M3  学习笔记 手机看文章 扫描二维码
随时随地手机看文章
最近在学ARM Cortex-M3,找了本号称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。

第四章 指令系统
数据传送类指令
寄存器到寄存器传送:MOV 指令、MVN指令
MOV R8, R3; R8 = R3
MVN R8, R3; R8 = -R3
学过微机原理的都应记得,x86中一条MOV 指令存储器和寄存器间的任意传送。ARM 中是不行的,这也是CISC和RISC 内核的一个比较明显的区别。

存储器到寄存器传送:LDRx 指令、LDMxy指令
寄存器到存储器:STRx 指令、STMxy指令

LDRx 指令的x可以是B(byte)、H(half word)、D(Double word)或者省略(word),具体的用法如下:

示例

功能描述

LDRB Rd, [Rn, #offset]

从地址Rn+offset处读取一个字节送到Rd

LDRH Rd, [Rn, #offset]

从地址Rn+offset处读取一个半字送到Rd

LDR Rd, [Rn, #offset]

从地址Rn+offset处读取一个字送到Rd

LDRD Rd1, Rd2, [Rn, #offset]

从地址Rn+offset处读取一个双字(64位整数)送到Rd1(低32位)和Rd2(高32位)中。

 

STRx 指令的x同样可以是B(byte)、H(half word)、D(Double word)或者省略(word),具体的用法如下:

示例

功能描述

STRB Rd, [Rn, #offset]

把Rd中的低字节存储到地址Rn+offset处

STRH Rd, [Rn, #offset]

把Rd中的低半字存储到地址Rn+offset处

STR Rd, [Rn, #offset]

把Rd中的低字存储到地址Rn+offset处

STRD Rd1, Rd2, [Rn, #offset]

把Rd1(低32位)和Rd2(高32位)表达的双字存储到地址Rn+offset处

 

LDRx和STRx指令还有一种带预索引的格式,下面举个例子(注意语句中的“!”):

LDR.W R0,[R1, #20]! ;预索引

上面语句的意思是先把地址R1+offset处的值加载到R0,然后,R1 ßR1+ 20

还有一种后索引形式,注意与上面的预索引的区别(还要注意语句中没有“!”):

STR.W R0, [R1], #-12 ;把R0的值存储到地址R1处。完毕后, R1ßR1+(-12)

 

LDMxy指令和STMxy指令可以一次传送更多的数据。

X可以为要I或D,I表示自增(Increment),D表示自减(Decrement)。

Y可以为A或B,表示自增或自减的时机是在每次访问前(Before)还是访问后(After)。

另外,指令带有“.W”后缀表示这条指令是32位的Thumb-2指令,否则是16位的指令。

示例

功能描述

LDMIA Rd!, {寄存器列表}

从Rd处读取多个字,并依次送到寄存器列表中的寄存器。每读一个字后Rd自增一次,16位指令

LDMIA.W Rd!, {寄存器列表}

从Rd处读取多个字,并依次送到寄存器列表中的寄存器。每读一个字后Rd自增一次

STMIA Rd!, {寄存器列表}

依次存储寄存器列表中各寄存器的值到Rd给出的地址。每存一个字后Rd自增一次,16位指令

STMIA.W Rd!, {寄存器列表}

依次存储寄存器列表中各寄存器的值到Rd给出的地址。每存一个字后Rd自增一次

LDMDB.W Rd!, {寄存器列表}

从Rd处读取多个字,并依次送到寄存器列表中的寄存器。每读一个字前Rd自减一次

STMDB.W Rd!, {寄存器列表}

存储多个字到Rd处。每存一个字前Rd自减一次

 

这里需要特别注意!的含义,它表示要自增(Increment)或自减(Decrement)基址寄存器Rd的值,时机是在每次访问前(Before)或访问后(After)。比如:

假设 R8=0x8000,则

STMIA.W R8!, {R0-R3} ; R8值变为0x8010

STMIA.W R8, {R0-R3} ; R8值不变

 

上面两行代码都是将R0-R3共16个字节的数据存储到从0x8000开始的16个字节空间中,唯一的区别是第一条指令执行完后R8被更新为0x8010,而第二条指令不更新R8。

 

立即数的加载

MOV支持8位立即数加载,比如:

MOV R0, #0x12

 

32位指令MOVW(加载到寄存器的低16位)和MOVT(加载到寄存器的高16位)可以支持16位立即数加载。如果要加载32位的立即数,必须先使用MOVW,再使用MOVT,因为MOVW会清零高16位。

 

LDR 和ADR的区别

LDR和ADR都是伪指令,都可以用来加载一个立即数(也可以是一个地址),如果加载的是程序地址,LDR会自动地把LSB置位,ADR则不会:

LDR R0, =address1 ; R0= 0x4000 | 1

ADR R1, address1 ; R1= 0x4000。注意:没有“=”号

address1

0x4000: MOV R0, R1

 

特殊功能寄存器只能用MSR/MRS指令访问:

MRS , ;读特殊功能寄存器的值到通用寄存器

MSR , ;写通用寄存器的值到特殊功能寄存器

 

下面是两个例子:

MRS R0, PRIMASK ; 读取PRIMASK到R0中

MSR BASEPRI, R0 ;写入R0到BASEPRI中

 

但是需要注意大多数的特殊功能寄存器都只能在特权级下访问,非特权级下只能访问APSR
关键字:ARM  Cortex-M3  学习笔记 引用地址:ARM Cortex-M3 学习笔记(4-2)

上一篇:Linux 驱动--ADC驱动
下一篇:STM32F10x 学习笔记10(基本定时器)

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

ARM平台上Linux异常处理代码简要分析
Linux version 3.10.40 ARM处理器支持多种异常模式,如reset,irq,fiq等,发生异常后处理器根据配置跳到指定的地址运行,可以配置成从0地址开始,也可以配置成从0xFFFF0000地址开始。我们从两个角度分析Linux上的实现,第一是负责异常处理的代码是如何安装到该地址的,第二是这些代码的处理流程是什么样的。 一 放置异常处理代码流程 依次涉及: init/main.c中的start_kernel函数 arch/arm/kernel/setup.c中的setup_arch函数 arch/arm/mm/mmu.c中的paging_init和devicemaps_init函数 a
[单片机]
基于ARMLinux的无线音视频对讲系统设计
随着数字化和网络化时代的到来,尤其是宽带无线网络的发展,为音视频这样大数据量传输业务在无线网络上的应用提供了契机。同时由于音视频独特的感官特性,使其相关的应用需求也变得越来越迫切。无线多媒体是多媒体和移动通信这两个领域的技术相互融合的产物,成为当今通信领域的一个热点。鉴于Linux内核的开源性,采用其作为操作系统,从而使整个系统具有更好的实时性和稳定性。整个系统以ARM11为核心处理器、采用新一代视频编解码标准H.264进行编译码,并通过无线网络传输音视频。它充分利用S3C6410微处理器内部集成的多媒体编解码器(Multi-FormatvideoCodec,MFC),有效提高了系统的性价比。整个系统为无线多媒体音视频的传输提供了
[单片机]
基于ARMLinux的无线音视频对讲系统设计
μC/OS-Ⅱ在ARM7上移植方法的探讨与实现
随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统,通常,对嵌入式软件的基本要求是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统很多,如VxWorks,Windows CE,pSOS,QNX,LynxOS等,这些操作系统都具有高可靠性、强实时性等特点,但他们都是商业操作系统,价格昂贵,人们往往很难接受,μC/OS-Ⅱ操作系统的出现是对这些商业操作系统的一个很大的冲击。 1 μC/OS-Ⅱ操作系统简介 μC/OS-Ⅱ是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求,裁减掉
[单片机]
μC/OS-Ⅱ在<font color='red'>ARM</font>7上移植方法的探讨与实现
ARM-Linux 内核移植--基于FL2440开发板(修改为Linux单系统)
硬件平台:FL2440开发板 内核版本:2.6.28 主机:ubuntu 11.04 内核版本:2.6.39 本来以为fl2440的nand flash大小为128M,问了客服才知道,现在FL2440使用的是现代的flash,现在都换成256M的了,只是飞凌的bootloader没有相应的修改,它使用的既不是u-boot,也不是vivi,而是自己的bootloader。现在修改bootloader源码中的nand.c 修改如下: //可更改删除分区,分区名字不可改 static struct Partition NandPart = { {0, 0x00020000, boot },
[单片机]
<font color='red'>ARM</font>-Linux 内核移植--基于FL2440开发板(修改为Linux单系统)
STM8L探索套件学习笔记-RTC实时时钟(六)
RTC的时钟可以选择四种时钟HSE/HIS/LSE/LSI,如下图所示。相比STM32的RTC需要相关软件配合才能RTC功能。STM8L更加灵活,相关寄存器就有33个,而且是硬件实现的,缺点是没有独立的RTC供电的电源。 实时时钟的主要代码: void main(void) { u8 temp=0; /* Infinite loop */ /* Select LSE (32.768 KHz) as RTC clock source */ CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1); CLK_PeripheralClockConfig(
[单片机]
S3C2440学习笔记五(2440slib.s源程序的分析)
以下程序是什么意思: 为啥这个文件是一堆的汇编代码,因为这里面涉及到了底层驱动,这里既是CPU的核心控制。涉及到了直接操作的寄存器和高速缓存,实际上和51的CPU是一回事,就是51可以干一件事,他就要干几十件事,没有强悍的架构和强大的寄存器和缓存团队,他就没法强悍!就跑400M吧,他为了效率加了cp15这个比较高速的协处理器,这个cp15的本质是数据处理中心。只有早期的PC机和现行的ARM还有这个东西,现在的PC机跑得非常快了,不需要CP15这类东西帮忙了。 补充一点是,CP15可以理解为MMU,它主要的工作是地址映射,也就是给CPU提供地址。SDRAM一般为32M或64M,但是对于32位的CPU,可以管理4G的空间。那么就把这个4
[单片机]
uC/OS-II在ARM系统上的移植与实现
摘要:使用ARM公司提供的ADS 开发工具,将uC/ OS - II 移植到ARM 处理器上,并将移植结果应用在跑马灯和数码管的实现上,运行正常,表明移植成功. 关键词:uC/ OS - II ;ARM;移植 0  引言 在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点 . 将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更
[嵌入式]
ARM裸机开发bootloader汇编语言
一、汇编语言概述 1、为什么要使用汇编 一般情况下我们不会用到汇编,但有两种情况下,我们要用到汇编。 1、启动代码。编写bootloader和内核时使用,主要是对cpu和内存进行初始化时使用,因为这个时候还没有c语言的环境(堆栈还没有建立),所以不能用c语言。 2、高效率的特殊需求。因为汇编语言的执行效率要高于c语言,所以对某些对效率要求高的程序要用到汇编,可以是汇编与c语言的混合编程。 2、汇编分类 1、ARM标准汇编,适用于windows平台下ARM公司开发的汇编器ADS。 2、GNU汇编,linux平台下GNU交叉编译工具链中的汇编器。它与ARM标准的一点不同是GNU汇编要在段标记符前加点,例如 .text。而AR
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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