zoukankan      html  css  js  c++  java
  • ARM寄存器学习,王明学learn

                      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是模式位,这些位决定了处理器的运行模式。具体含义如表所示。














  • 相关阅读:
    基本概念和术语
    Html中的<label>标签
    shell17echo打印带颜色的文字
    shell-15 &的三种不同
    shell-14 多个命令以分号隔开
    shell-13 tee管道可以重定向但是不截流
    shell-12实用cat完成文件复制
    shell-11输入内容到文件
    shell-10kill杀死作业号和进程号
    shell-9前后台切换
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5301166.html
Copyright © 2011-2022 走看看