ARM寄存器学习

  ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。

  37个寄存器=7个未分组寄存器(R0~R7)+ 2×(5个分组寄存器R8~R12)+6×2(R13=SP,R14=lr 分组寄存器) + 1(R15=PC)+1(CPSR) + 5(SPSR)

一、用途和访问权限

 R0~R7:USR(用户模式)、fiq(快速中断模式)、irq(中断模式)、svc(超级用法模式)、abt、und
  R8~R12:R8_usr~R12_usr(usr,irq,svc,abt,und)
  R8_fiq~R12_fiq(fiq)
  R11=fp
R12=IP:  (从反汇编上看,fp和ip一般用于存放SP的值)
R13~R14:R13_usr R14_usr(每种模式都有自己的寄存器)
SP ~lr :R13_fiq R14_fiq
   R13_irq R14_irq
R13_svc R14_svc
R13_abt R14_abt
R13_und R14_und
  R15(PC):都可以访问(即PC的值为当前指令的地址值加8个字节)
R16:((Current Program Status Register,当前程序状态寄存器))SPSR _fiq,SPSR_irq,SPSR_abt,SPSR_und(USR模式没有 二、通用寄存器

2.1不分组通用寄存器

  R0-R7是不分组寄存器。这意味着在所有处理器模式下,访问的都是同一个物理寄存器。不分组寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应该注意。

2.2分组通用寄存器

1).分组寄存器R8-R12

  1. FIQ模式分组寄存器R8-R12

  2. FIQ以外的分组寄存器R8-R12

  对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。

2).分组寄存器R13、R14

  1. 寄存器R13通常用做堆栈指针SP用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。

  2. 寄存器R14用作子程序链接寄存器(Link Register-LR),也称为连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。

采用以下的记号来区分不同的物理寄存器:

  R13_

  R14_

  其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。

  对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。

  在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。以上的描述可用指令完成。

  执行以下任意一条指令:

  MOV  PC, LR

  BX  LR

  在子程序入口处使用以下指令将R14存入堆栈:

  STMFD  SP!,{,LR}

  对应的,使用以下指令可以完成子程序返回:

  LDMFD  SP!,{,PC}

  R14也可作为通用寄存器。

2.3程序计数器寄存器

  寄存器R15被用作程序计数器,也称为PC 。其值等于当前正在执行的指令的地址+8(因为在取址和执行之间多了一个译码的阶段)。R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。

三、状态寄存器

  ARM所有工作模式下都可以访问程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息

  当前程序状态寄存器CPSR在每种异常模式下都有一个对应的物理寄存器——程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的值,以便异常返回后恢复异常发生时的工作状态。使用MSR和MRS指令来设置和读取这些寄存器。

SPSR用来进行异常处理,其功能包括:

(1)保存ALU中的当前操作信息。

(2)控制允许和禁止中断。

(3)设置处理器的运行模式。

3.1CPSR/SPSR

  条件码标志(Condition Code Flags)

  N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。在ARM状态下,绝大多数的指令都是有条件执行的;在Thumb状态下,仅有分支指令是有条件执行的。条件码标志位的各位具体含义如表所示。

3.2控制位

  CPSR的低8位(包括I、F、T和M[4∶0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,那么这些位也可以由程序修改。

(1)中断禁止位I、F。

I=1,禁止IRQ中断;

F=1,禁止FIQ中断。

(2)T标志位:该位反映处理器的运行状态。

  对于ARM体系结构v5及以上版本的T系列处理器,当该位为l时,程序运行于Thumb状态,否则运行于ARM状态。对于ARM体系结构v5及以上版本的非T系列处理器,当该位为1时,执行下一条指令以引起位定义的指令异常;当该位为0时,表示运行于ARM状态。

(3)运行模式位M[4∶0]:MO、M1、M2、M3、M4是模式位,这些位决定了处理器的运行模式。具体含义如表所示。



ARM寄存器学习,王明学learn的更多相关文章

  1. ARM指令学习,王明学learn

    ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令    2.— MVN 数据取反传送指令    3.— CMP 比较指令    4.— CMN 反值比较指令    5.— TST 位测试 ...

  2. ARM伪指令,王明学learn

    ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...

  3. ARM寻址方式,王明学learn

    ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...

  4. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  5. 协处理器,王明学learn

    协处理器 协处理器用于执行特定的处理任务,如:数学协处理器可以控制数字处理,以减轻处理器的负担.ARM可支持多达16个协处理器,其中CP15是最重要的一个. CP15提供16组寄存器 通过提供的16组 ...

  6. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  7. 消息队列通信,王明学learn

    消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...

  8. 共享内存同行,王明学learn

    共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...

  9. 信号量进程同步,王明学learn

    信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ...

随机推荐

  1. FlexPaper使用小结

    FlexPaper相关介绍及后台swf生成,参见 FlexPaper实现文档在线浏览(附源码) 前台swf在flash中的预览: 1.下载相关文档 FlexPaper Classic 2.将下载的文件 ...

  2. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

  3. Django函数——url()

    The url() function is passed four arguments, two required: regex and view, and two optional: kwargs, ...

  4. SQL中关于字符串的处理

    DECLARE @STR VARCHAR(MAX),@PRAM VARCHAR(20)SET @STR='中华人民共和国万岁'--字符串连接SET @STR=@STR+'an'+@STR --字符串拆 ...

  5. [转] Android Volley完全解析(一),初识Volley的基本用法

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法   转载请注明出处:http ...

  6. MST:Agri-Net(POJ 1258)

     Agri-Net 题目大意:农夫有一片农场,现在他要把这些田地用管子连起来,田地之间有一定距离,铺设每一段管子的长度与这些田地与田地距离是一样的,问你最小的铺设方案. 这一题很裸,Kruskal算法 ...

  7. 把图标改成web字体

    一.下载自己想要的矢量图标,然后在AI中打开二.在AI中将有瑕疵的图标修改一下,再分别另存为svg格式的图标三.打开IcoMoon Web app网页,然后点击左上角的+Import Icons添加你 ...

  8. 仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同

           我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返 ...

  9. 【leetcode】Reverse Nodes in k-Group (hard)☆

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  10. 【leetcode】Best Time to Buy and Sell 2(too easy)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...