zoukankan      html  css  js  c++  java
  • ARM寄存器

    一、ARM工作状态下的寄存器组织


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


    通用寄存器


    通用寄存器包括R0~R15,可以分为3类:


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


    (2)分组寄存器R8~R14


    (3)程序计数器PC(R15)



    1.未分组寄存器R0~R7


    在所有运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途.因此在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏.


    2.分组寄存器R8~R14


    对于分组寄存器,它们每一次所访问的物理寄存器都与当前处理器的运行模式有关.对于R8~R12来说,每个寄存器对应2个不同的物理寄存器,当使用FIQ(快速中断模式)时,访问寄存器R8_fiq~R12_fiq;当使用除FIQ模式以外的其他模式时,访问寄存器R8_usr~R12_usr.
    对于R13,R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式与系统模式共用,另外5个物理寄存器对应其他5种不同的运行模式,并采用以下记号来区分不同的物理寄存器:
    R13_
    R14_
    其中mode可为:usr,fiq,irq,svc,abt,und.


    寄存器R13 在ARM指令中常用作堆栈指针SP,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针,而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针.

    由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行


    寄存器R14 称为子程序链接寄存器 LR (Link Register),当执行子程序调用指令(BL)时,R14 可得到 R15 (程序计数器PC) 的备份.

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


    执行以下任意一条指令:


    MOV PC, LR


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


    STMFD SP!,{,LR}
    对应的,使用以下指令可以完成子程序返回:


    LDMFD SP!,{,PC}
    R14也可作为通用寄存器。


    3,程序计数器PC(R15)


    寄存器R15 用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC,在Thumb状态下,位[0]为0,位[31:1]用于保存PC.
    由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即 PC的值为当前指令的地址值加8个字节程序状态寄存器。


    4,寄存器R16


    寄存器R16 
    用作 CPSR (CurrentProgram Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
    每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。


    由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的

     

    二、Thumb工作状态下的寄存器组织


           Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)
    程序计数器(PC)堆栈指针(SP) 连接寄存器(LR)  当前状态寄存器(CPSR)。同时,在每一种特权模式下都有一组SP、LR和SPSR。图2.4表明Thumb状态下的寄存器组织。

     

    Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系:
           ─ Thumb状态下和ARM状态下的R0~R7是相同的。
           ─ Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的。
           ─ Thumb状态下的SP对应于ARM状态下的R13。
           ─ Thumb状态下的LR对应于ARM状态下的R14。
           ─ Thumb状态下的程序计数器对应于ARM状态下R15
    以上的对应关系如图2.5所示:


    访问THUMB状态下的高位寄存器(Hi-registers):
           在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分,但可使用汇编语言程序受限制的访问这些寄存器,将其用作快速的暂存器。使用带特 殊变量的MOV指令,数据可以在低位寄存器和高位寄存器之间进行传送;高位寄存器的值可以使用CMP和ADD指令进行比较或加上低位寄存器中的值。


    程序状态寄存器


           ARM体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs)

    备份的程序状态寄存器用来进行异常处理,其功能包括:
          ─ 保存ALU中的当前操作信息
          ─ 控制允许和禁止中断
          ─ 设置处理器的运行模式


    条件码标志(Condition Code Flags)


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


      N  Negative        如果结果是负数则置位
      Z  Zero            如果结果是零则置位
      C  Carry           如果发生进位则置位
      O  Overflow        如果发生溢出则置位
      I  IRQ             中断禁用
      F  FIQ             快速中断禁用
      T  工作状态位,1为Thumb;0为ARM


    条件码标志位的含义

    标志位

    含      义

    N

    当用补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果是正数或零。

    Z

    Z=1表示运算的结果为零;Z=0表示运算的结果不为零。

    C

    有4种方法影响C的值:

    l  加法运算:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。

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

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

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

    V

    有2种方法设置V的值:

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

    l  对于其它的非加/减法运算指令,V的值通常不改变。


    N即符号位,与最高符号位相同。
    C主要判断无符号数的加减法是否存在进位或借位,不过减法的时候有点特殊。
      S1 和 S0 是处理器模式标志:
      
    M4   M3   M2   M1   M0   模式
    1    0    0    0    0    USR - 用户模式
    1    0    0    0    1    FIQ - 快速中断模式
    1    0    0    1    0    IRQ - 中断模式
    1    0    0    1    1    SVC - 超级用户模式
    1    0    1    1    1    ABT - 中止
    1    1    0    1    1    und - 未定义
    1    1    1    1    1    SYS - 系统模式
    
    
    
    
    转载http://www.cnblogs.com/laojie4321/archive/2012/04/05/2432372.html
  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/csnd/p/11800701.html
Copyright © 2011-2022 走看看