[ARM裸机程序][4]ARM寄存器详解

转载自:https://www.cnblogs.com/wrjvszq/p/4199682.html

ARM寄存器

ARM处理器总共有37个寄存器其可以分为以下两类:

  1. 通用寄存器(31个)
    • 不分组寄存器(R0—R7)
    • 分组寄存器(R8—R14)
  2. PC指针(R15)
  3. 状态寄存器(6个)
    • CPSR(1个)
    • SPSR(5个)
      ARM寄存器
      ARM寄存器

ARM寄存器详解

不分组寄存器(R0—R7)

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

分组寄存器(R8—R14)

  • 对于R8~R12,当使用FIQ(快速中断模式)时访问寄存器R8_fiq~R12_fiq,当使用除FIQ模式以外的其他模式时,访问寄存器R8~R12。
  • 对于R13,R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式与系统模式共用(图中的R13,R14),另外5个物理寄存器对应其他5种不同的运行模式,并采用以下记号来区分不同的物理寄存器分别为fiq,irq,svc,abt,und.
    1. R13称为堆栈指针寄存器SP
      特别注意:由于每一种模式都有自己的R13,所以我们在自己初始化的时候一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。
    2. R14称为子程序链接寄存器LR
      有两个特殊功能,一种是每一种模式下都可以用于保存函数的返回地址,另外就是异常处理后的返回地址,如中断。

PC指针(R15)

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

CPSR

CPSR

  • N: 当两个表示的有符号整数运算时,1表示运算结果为负数,0表示结果为正或零。
  • Z:1表示运算的结果为零,0表示运算的结果不为零。对于CMP指令,1表示进行比较的两个数大小相等。
  • C:下面分四种情况讨论C的设置方法:
    1. 加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。
    2. 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
    3. 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
    4. 对于其他的非加/减运算指令,C的值通常不改变。
  • V:下面分两种情况讨论V的设置方法
    1. 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
    2. 对于其他的非加/减运算指令,C的值通常不改变。
  • I:1表示禁止外部(硬件)中断(IRQ)。
  • F:1表示禁止快速中断(FIQ)。
  • T:1表示为thumb状态;0为arm状态。
  • M[4:0]:用来设置处理器的工作模式。

    SPSR

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

猜你喜欢

转载自blog.csdn.net/zimengyu2020/article/details/80344608