ARM寄存器学习,王明学learn

时间:2023-03-09 16:30:49
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模式没有 二、通用寄存器
ARM寄存器学习,王明学learn
ARM寄存器学习,王明学learn
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寄存器学习,王明学learn

  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状态下,仅有分支指令是有条件执行的。条件码标志位的各位具体含义如表所示。

ARM寄存器学习,王明学learn

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状态。

ARM寄存器学习,王明学learn

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

ARM寄存器学习,王明学learn