ARM处理器中的寄存器基本知识详解

发布者:ZenMaster123最新更新时间:2020-09-15 来源: elecfans关键字:ARM  处理器  寄存器  基本知识 手机看文章 扫描二维码
随时随地手机看文章

ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄器包括:

● 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。

● 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。


ARM微处理器支持7种运行模式,分别为:

● usr(用户模式):ARM处理器正常程序执行模式。

● fiq(快速中断模式):用于高速数据传输或通道处理

● irq(外部中断模式):用于通用的中断处理

● svc(管理模式):操作系统使用的保护模式

● abt (数据访问终止模式): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。

● sys(系统模式): 运行具有特权的操作系统任务。

● und(未定义指令中止模式):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。


ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。


大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。


除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。


ARM处理器在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。


ARM处理器有32位ARM和16位Thumb两种工作状态。在32位ARM状态下执行字对齐的ARM指令,在16位Thumb状态下执行半字对齐的Thumb指令。


在Thumb状态下,程序计数器PC(Program Counter)使用位[1]选择另一个半字。

ARM处理器在两种工作状态之间可以切换,切换不影响处理器的模式或寄存器的内容。

(1)当操作数寄存器的状态位(位[0])为1时,执行BX指令进入Thumb状态。如果处理器在Thumb状态进入异常,则当异常处理(IRQ、FIQ、Undef、Abort和SWI)返回时,自动转换到Thumb状态。

(2)当操作数寄存器的状态位(位[0])为0时,执行BX指令进入ARM状态,处理器进行异常处理(IRQ、FIQ、Reset、Undef、Abort和SWI)。在此情况下,把PC放入异常模式链接寄存器中。从异常向量地址开始执行也可以进入ARM状态。


n ARM处理器的寄存器组织

ARM处理器的37个寄存器被安排成部分重叠的组,不能在任何模式都可以使用,寄存器的使用与处理器状态和工作模式有关。如图2.3.1所示,每种处理器模式使用不同的寄存器组。其中15个通用寄存器(R0~R14)、1或2个状态寄存器和程序计数器是通用的。


通用寄存器

通用寄存器(R0~R15)可分成不分组寄存器R0~R7、分组寄存器R8~R14和程序计数器R15 三类。

(1)不分组寄存器R0~R7

不分组寄存器R0~R7是真正的通用寄存器,可以工作在所有的处理器模式下,没有隐含的特殊用途。

(2)分组寄存器R8~R14

分组寄存器R8~R14取决于当前的处理器模式,每种模式有专用的分组寄存器用于快速异常处理。


寄存器R8~Rl2可分为两组物理寄存器。一组用于FIQ模式,另一组国用于除FIQ以外的其他模式。第1组访问R8_fiq~R12_fiq,允许快速中断处理。第二组访问R8_usr~R12_usr,寄存器R8~R12没有任何指定的特殊用途。

表明用户或系统模式使用的一般寄存器己被异常模式特定的另一寄存器所替代。


寄存器R13~R14可分为6个分组的物理寄存器。1个用于用户模式和系统模式,而其他5个分别用于svc、abt、und、irq和fiq五种异常模式。访问时需要指定它们的模式,如:R13_,R14_;其中:可以从usr、svc、abt、und、irq和fiq六种模式中选取一个。


寄存器R13通常用作堆栈指针,称作SP。每种异常模式都有自己的分组R13。通常R13应当被初始化成指向异常模式分配的堆栈。在入口处,异常处理程序将用到的其他寄存器的值保存到堆栈中;返回时,重新将这些值加载到寄存器。这种异常处理方法保证了异常出现后不会导致执行程序的状态不可靠。


寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。当执行带链接分支(BL)指令时,得到R15的备份。 在其他情况下,将R14当做通用寄存器。类似地,当中断或异常出现时,或当中断或异常程序执行BL指令时,相应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。


FIQ模式有7个分组的寄存器R8~R14,映射为R8_fiq~R14_fiq。在ARM状态下,许多FIQ处理没必要保存任何寄存器。User、IRQ、Supervisor、Abort和Undefined模式每一种都包含两个分组的寄存器R13和R14的映射,允许每种模式都有自己的堆栈和链接寄存器。


(3)程序计数器R15

寄存器R15用作程序计数器(PC)。在ARM状态,位[1:0]为0,位[31:2]保存PC。在Thumb状态,位[0]为0,位[31:1]保存PC。R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。


① 读程序计数器。指令读出的R15的值是指令地址加上8字节。由于ARM指令始终是字对齐的,所以读出结果值的位[1:0]总是0(在Thumb状态下,情况有所变化)。读PC主要用于快速地对临近的指令和数据进行位置无关寻址,包括程序中的位置无关转移。

② 写程序计数器。写R15的通常结果是将写到R15中的值作为指令地址,并以此地址发生转移。由于ARM指令要求字对齐,通常希望写到R15中值的位[1:0]=0b00。

由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。


程序状态寄存器

寄存器R16用作程序状态寄存器CPSR(Current Program Status Register,当前程序状态寄存器)。在所有处理器模式下都可以访问CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR(Saved Program Status Register)。当异常出现SPSR用于保留CPSR的状态。


CPSR和SPSR的格式如下:

(1)条件码标志

N、Z、C、V(Negative、Zero、Carry、oVerflow)均为条件码标志位(Condition Code Flags),它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。CPSR中的条件码标志可由大多数指令检测以决定指令是否执行。在ARM状态下,绝大多数的指令都是有条件执行的。在Thumb状态下,仅有分支指令是有条件执行的。通常条件码标志通过执行比较指令(CMN、CMP、TEQ、TST)、一些算术运算、逻辑运算和传送指令进行修改。


条件码标志的通常含义如下:

N:如果结果是带符号二进制补码,那么,若结果为负数,则N=1;若结果为正数或0,则N=0。

Z:若指令的结果为0,则置1(通常表示比较的结果为“相等”),否则置0。

C:可用如下4种方法之一设置:

一-加法(包括比较指令CMN)。若加法产生进位(即无符号溢出),则C置1;否则置0。

一-减法(包括比较指令CMP)。若减法产生借位(即无符号溢出),则C置0;否则置1。

一-对于结合移位操作的非加法/减法指令,C置为移出值的最后1位。

一-对于其他非加法/减法指令,C通常不改变。

V:可用如下两种方法设置,即

一-对于加法或减法指令,当发生带符号溢出时,V置1,认为操作数和结果是补码形式的带符号整数。

一-对于非加法/减法指令,V通常不改变。


(3)控制位

程序状态寄存器PSR(Program Status Register)的最低8位I、F、T和M[4:0]用作控制位。当异常出现时改变控制位。处理器在特权模式下时也可由软件改变。

a.中断禁止位

I:置1,则禁止IRQ中断;

F:置1,则禁止FIQ中断。

b.T位

T=0 指示ARM执行;

T=1 指示Thumb执行。

c.模式控制位

M4、M3、M2、Ml和M0(M[4:0])是模式位,决定处理器的工作模式,如表所列。

M[4:0]工作模式可访问的寄存器

10000用户模式PC,CPSR,R14~R0

10001FIQ模式PC,R7~R0,CPSR, SPSR_fiq,R14_fiq~R8_fiq

10010IRQ模式PC,R12~R0,CPSR, SPSR_irq,R14_irq,R13_irq

10011管理模式PC,R12~R0, CPSR, SPSR_svc,R14_svc,R13_svc

10111中止模式PC,R12~R0, CPSR, SPSR_abt,R14_abt,R13_abt

11011未定义模式PC,R12~R0, CPSR, SPSR_und,R14_und,R13_und

11111系统模式PC,R14~R0,CPSR(ARM v4及以上版本)

并非所有的模式位组合都能定义一种有效的处理器模式。其他组合的结果不可预知。


(4)其他位

程序状态寄存器的其他位保留,用做以后的扩展。

关键字:ARM  处理器  寄存器  基本知识 引用地址:ARM处理器中的寄存器基本知识详解

上一篇:使用AM335x系列芯片该注意哪些问题
下一篇:ARM紧致内存TCM的解释

推荐阅读最新更新时间:2024-11-04 03:37

ARM引领图形处理器计算潮流,有效提升系统性能与能效
2012年8月6日,中国上海——ARM公司今日宣布,已为ARM® Mali™-T604 图形处理器(GPU)向Khronos*申请OpenCL™ 1.1 Full Profile 符合性认证,为移动应用、嵌入式应用以及智能电视市场带来桌面级的GPU计算强大特性。ARM是首家申请Full Profile OpenCL标准符合性认证的GPU知识产权(IP)供应商。通过为开发者提供一致而有效的设计构建平台来帮助实现图形计算,并为终端用户设备性能与电池寿命方面的切实利益,这项行动预计将有助于视觉计算落实至日常生活中。 GPU计算已经成为一种趋势,它可利用GPU原本用于图形处理的计算性能来协助增强主处理器(或CPU)处理一些在GPU架构下
[单片机]
三星拟向其他厂商出售Exynos处理器 打乱联发科计划
    新浪科技讯 北京时间1月24日晚间消息,台湾地区媒体Digitimes今日援引行业人士的消息称,三星计划面向其他智能手机厂商销售自家的Exynos处理器,以进一步抢占全球手机处理器市场份额。   该知情人士称,三星此举旨在提高自家硅晶圆工厂的利用率,同时提高在全球智能手机处理器市场的份额,尤其是中端市场。众所周知,联发科一直专注于该市场,因此很可能遭受三星的冲击。   去年,三星在全球智能手机芯片市场排名第四,位居高通、苹果和联发科之后。分析人士称,三星能否顺利进入该市场,并一举超越联发科,将在很大程度上取决于能否为客户提供其他服务,如承诺供应OLED屏幕和闪存等产品。   市场观察家称,当前全球智能手机出货量
[半导体设计/制造]
怎样处理ARM体系下浮点数Middle-Endian问题
由于可移植性好,相当一部分嵌入式软件都是用C/C++语言开发的,而C/C++语言编写的程序中数据存储字节顺序是与编译平台所用的CPU相关的,所以嵌入式软件移植过程中,数据存储字节顺序是需要重点处理的地方。 在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入式GIS软件开发平台和运行平台,再对移植过程中遇到的问题进行跟踪和分析。找到问题根源,最终给出两种解决方案。 1 嵌入式GIS软件 嵌入式GIS软件是用C++语言开发的,运行在PDA上的嵌入式软件
[单片机]
怎样处理<font color='red'>ARM</font>体系下浮点数Middle-Endian问题
技术文章—如何为数据集中器选择合适的处理器
随着智能电网的快速发展,越来越多的住宅终端设备中,诸如智能电表和数据集中器,开始出现了各种智能分析功能。因此,智能电网越来越多的需要依赖各种通信方式来实时的获取、分析电网状态,及时发现问题并报告问题。数据集中器在智能电网中作为终端用户数据的集中器单元,发挥着非常重要的作用。如今,随着终端设备数量的不断增加和大量数据交换需求的增长,对于数据集中器而言,在性能和接口方面将面临新的需求和挑战。因此, 为数据集中器选择核心处理器单元时,需考虑其支持各种通信接口,并能够提供可靠且精确的数据处理的能力。 电网通信的多接口支持 数据集中器通常需要功能强大的、集成多种外设的Arm®处理器,可与诸如电表、气表和水表等各类终端设备或电网基础设
[嵌入式]
技术文章—如何为数据集中器选择合适的<font color='red'>处理器</font>
ARM 与 51单片机通信
硬件 mini2440核心板,另外一块带串口的单片机学习板(挂着DS18B20),学习板连续输出DS18B20的温度值,波特率19200。 在一个文件夹里新建一个文件,我的是voltage_set.c(以后用来调压) #include stdio.h #include stdlib.h #include termio.h #include unistd.h #include fcntl.h #include getopt.h #include time.h #include errno.h #include string.h #define FALSE -1 #define TRUE 1 int speed
[单片机]
ARM汇编和Gnu汇编的转换
将 ARM ADS 下的汇编码移植到 GCC for ARM 编译器时,有如下规则: 1, 注释行以 @ 或 /* ... */ 代替 ; 2, GET 或 INCLUDE = .INCLUDE 如: get option.a = .include option.a 3, EQU = .equ TCLK2 EQU PB25 = .equ TCLK2, PB25 SETA == .equ SETL == .equ BUSWIDTH SETA 16 = .equ BUSWIDTH, 16 4, EXPORT = .global IMPORT = .extern GBLL = .global GBLA = .global
[单片机]
GNU ARM汇编--(十一)小结一下
对s3c2440的一部分做了学习,更深的了解了汇编以及arm体系,还有中断,调试底层汇编过程的最大感触就是仔细阅读datasheet,因为那是英文文档. 前面写的都是嵌入式底层比较基础的东西,后面要做的内容: 1.先裸机搞定iic,iic包括用控制器实现的和用GPIO模拟的,这样可以加深时序的理解. 2.spi也想看一下,虽然2440有spi,但是没有外设,这个比较麻烦. 3.搞清楚嵌入式系统中的存储系统,主要是内存(MMU)和flash 4.在前面的基础上可以整体上把握bootloader了 5.因为对linux的文件系统和设备模型有一定的了解,在3的基础上可以开始
[单片机]
ARM架构下添加系统调用(与32位x86区别)
在这两种架构下添加系统调用的步骤是类似的,简要地比较一下,以2.6.28.6内核为例。 1.在内核源码相应位置(如sys.c或其他与这个函数联系紧密的文件)添加新的内核函数作为系统调用,形如 asmlinkage long sys_foo(void) { } 2.加入系统调用表。ARM架构存放于/arch/arm/kernel/call.S中,形如CALL(sys_foo);x86架构放于/arch/x86/kernel/syscall_table_32.S中,形如.long sys_foo。 3.定义系统调用号。ARM架构存放于/arch/arm/include/asm/unistd.h中,形如 #defin
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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