寒假闲来无事准备将自己的走过的arm之路总结一下,今天就先从arm的寄存器说起吧,欢迎各位拍砖。

要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式:

Arm处理器有七种工作模式,为的是形成不同的使用级别,以防造成对系统的破坏。不同模式可以访问的寄存器不同,可以运行的指令不同。

(1)usr(10000):普通应用程序运行的模式(应用程序)

(2)FIQ(10001):快速中断模式,以处理快速情况,高速数据传输

(3)IRQ(10010):外部中断模式,普通中断处理

(4)svc(10011):保护模式(管理模式),操作系统使用的特权模式(内核)

(5)abt(10111):数据访问中止模式,用于虚拟存储和存储保护

(6)und(11011):未定义指令终止模式,用于支持通过软件仿真硬件的协处理器

(7)sys(11111):系统模式,用于运行特权级的操作系统任务(armv4以上版本才具有)

注意:usr是普通模式,其他六种是特权模式,而除了usr和sys模式以外的五种模式是异常模式

--------------------------------------------------------------------

Ok下面进入正题:

我们首先可以找到这样一本资料《ARM Architecture Reference Manual》在其中的Programmers’Model一章中,我们可以轻松的找到官方文档对寄存器的说明,建议大家去看看官方的英文文档,我将其中的重要内容简单的总结一下。

Arm处理器总共有37个寄存器其可以分为以下两类(在此我先列出大框架下面会一一介绍):

1.        通用寄存器(31个)

1.        不分组寄存器(R0—R7)

2.        分组寄存器(R8—R14)

3.        PC指针(R15)

2.        状态寄存器(6个)

1.        CPSR(1个)

2.        SPSR(5个)

相信通过上面的介绍大家对arm的寄存器有个初步的印象,下面官方文档对寄存器的说明:

下面我将会结合上图和我上面列出的大框架对寄存器进行解析:

1.        不分组寄存器(R0—R7)

在所有的运行模式下都使用同一个物理寄存器,它们未被系统用作特殊的用途。

2.        分组寄存器(R8—R14)

a)        对于R8~R12,当使用FIQ(快速中断模式)时访问寄存器R8_fiq~R12_fiq,当使用除FIQ模式以外的其他模式时,访问寄存器R8~R12

b)        对于R13,R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式与系统模式共用(图中的R13,R14),另外5个物理寄存器对应其他5种不同的运行模式,并采用以下记号来区分不同的物理寄存器分别为fiq,irq,svc,abt,und.(如上图)

i.R13在ARM指令中常用作堆栈指针SP

特别注意:由于每一种模式都有自己的R13,所以我们在自己初始化的时候一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。

ii. R14称为子程序链接寄存器LR(Link Register)

有两个特殊功能,一种是每一种模式下都可以用于保存函数的返回地址,另外就是异常处理后的返回地址,如中断。

3.        PC指针(R15)

R15用作程序计数器(PC)对应一个物理寄存器,由于ARM体系结构采用了多级流水线技术(不了解多级流水线的可以访问这个博客http://blog.csdn.net/abclixu123/article/details/7471822,博主讲的不错),对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节程序状态寄存器。

4.        CPSR

在官方文档中我们可以找到

下面介绍其中几个比较重要的位,其他位,大家可以参考官方手册:

N: 当两个表示的有符号整数运算时,1表示运算结果为负数,0表示结果为正或零。

Z:1表示运算的结果为零,0表示运算的结果不为零。对于CMP指令,1表示进行比较的两个数大小相等。

C:下面分四种情况讨论C的设置方法:

a)        加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。

b)        减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。

c)        对于包含移位操作的非加/减运算指令,C为移出值的最后一位。

d)       对于其他的非加/减运算指令,C的值通常不改变。

V:下面分两种情况讨论V的设置方法

a)        对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。

b)        对于其他的非加/减运算指令,C的值通常不改变。

I:1 表示禁止外部(硬件)中断(IRQ)
F:1 表示禁止快速中断(FIQ)
T:表示为thumb状态0为arm状态

M[4:0]:用来设置处理器的工作模式具体数据见本文开始的介绍。

5.       
SPSR

SPSR 除usr、sys外,对应用于异常保护的CPSR的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器。

以上是自己的arm寄存器的简单理解,希望各位提出宝贵意见,并且在这个寒假从今天开始没有意外的话我的博客会一天一更,努力学习,欢迎大家监督。

arm寄存器解析的更多相关文章

  1. ARM指令解析

    今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/ ...

  2. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  3. ARM架构解析

    ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...

  4. 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

    : 12MHz 晶振 对应 405 ~ 532 MHz 处理速度; -- : 16K 指令缓存, 16K 数据缓存; -- : 32KB 指令缓存, 32KB 数据缓存; (3) 内存接口对比 : 提 ...

  5. ARM寄存器学习,王明学learn

    ARM寄存器学习 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式. ...

  6. ARM 寄存器的介绍

    ARM  寄存器  31个通用, 32个程序状态寄存器 怎么算的呢: (R0--R15)   16  +  7 + 8  =31 通用 程序状态寄存器:    6 个 共  37 个. 不分组寄存器: ...

  7. R0-R37它是Arm 寄存器,那是,CPU内部。和GPIO注册所有外设。换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO寄存器只有一个特定的芯片。

    R0-R37它是Arm 寄存器.那是,CPU内部.和GPIO注册所有外设. 换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO有. 版权声明:本文博主原创文章.博客,未经同 ...

  8. ARM寄存器介绍

    ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.以及6个32位状态寄存器.但目前只使用了其中12位.ARM处理器共有7种不同的处理器模 ...

  9. ARM 寄存器

    ARM总共有37个寄存器 ARM寄存器物理分类 通用寄存器:1:不分组寄存器(R0--R7) 2:分组寄存器(R8-R14) 3:程序计数器(R15)(注意:又名pc指针) 程序状态寄存器:1:CPS ...

随机推荐

  1. netty结合websocket使用

    首先需要在后台建立netty服务器启动类; package com.cxy; import io.netty.bootstrap.ServerBootstrap; import io.netty.ch ...

  2. PANet训练自己的数据(VIA标注)

    当前最好的实例分割网络非PANet莫属,可是由于模型太新,网上的资料太少,最近的项目需要 实例分割,只能自己踩踩坑了,目前我还没看到一篇关于PANet训练的博客,只有几篇讲论文的. 环境:ubuntu ...

  3. pytorch实现depthwise convolution

    深度分离卷积是Xception这个模型中提出来的(不太确定,但肯定是它让这个概念为大众周知),具体来说分为两步,depthwise conv和pointwise conv,前者对输入特征图的每个通道进 ...

  4. [Leetcode]013. Roman to Integer

    public class Solution { public int romanToInt(String s) { if(s == null || s.length() == 0) return 0; ...

  5. Python语言、编译解释、动态库静态库、编译过程、头文件

    学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...

  6. P3225 [HNOI2012]矿场搭建

    传送门 对于一个点双联通分量,如果它连接了两个或更多割点 那么不论哪个点GG都有至少一条路通到其他的点双联通分量,所以我们不用考虑 如果它只连接一个割点,如果这个割点GG,那整个块也一起GG,所以要再 ...

  7. Codeforces 527C Glass Carving (最长连续0变形+线段树)

    Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...

  8. 测试用例逐步演进-xmind2excel(Python版)测试用例逐步演进-xmind2excel(Python版)

    最近,我在做项目的时候,经常被问到一个问题:如何做测试评审会更有效呢? 只要做过测试用例评审,特别是比较复杂的测试用例评审的时候,很多测试同学都会苦恼于如何能更有效的向大家说出自己的测试设计思路. 当 ...

  9. java spi机制和场景

    JDK中查找服务的实现的工具类是:java.util.ServiceLoader, jvm启动时自动查找META-INF/services/下面的实现类,并初始化实例 jdbc的mysql实现类 在静 ...

  10. my.副本

    梦幻西游手游 天蓬下凡 副本 第三关:天蓬终于决定要告白了,主怪大唐,护卫狮驼岭,帮凶是龙宫,打过这关也很简单. 第四关:康太尉找来了天兵,怪仍然是有法有攻,但是打起来也是不难. ZC: 姚太尉是物理 ...