ARM-Cortex-M架构寄存器详解

本文详细介绍了ARM处理器的通用寄存器,包括不分组寄存器R0-R7、分组寄存器R8-R14以及程序计数器R15。R15作为程序计数器,R13常作为堆栈指针,R14用作子程序链接寄存器。寄存器在不同模式下有不同的用途,如快速中断处理和异常模式下的堆栈管理。此外,还讨论了寄存器在异常处理和子程序调用中的作用以及对程序计数器的读写操作。
摘要由CSDN通过智能技术生成

通用寄存器


通用寄存器(R0-R15)可分成不分组寄存器R0-R7分组寄存器R8-R14程序计数器R15三类。

1 不分组寄存器R0-R7

不分组寄存器R0~R7是真正的通用寄存器,可以工作在所有的处理器模式下,没有隐含的特殊用途。

2 分组寄存器R8-R14

分组寄存器R8-R14取决于当前的处理器模式,每种模式有专用的分组寄存器用于快速异常处理。

  1. 寄存器R8-R12可分为两组物理寄存器。一组用于FIQ模式另一组用于除FIQ以外的其他模式。第1组访问R8_fiq-R12_fiq,允许快速中断处理。第二组访问R8_usr-R12_usr,寄存器R8-R12没有任何指定的特殊用途,表明用户或系统模式使用的一般寄存器己被异常模式特定的另一寄存器所替代。
  2. 寄存器R13-R14可分为6个分组的物理寄存器。1个用于用户模式和系统模式,而其他5个分别用于svc、abt、und、irq和fiq五种异常模式。访问时需要指定它们的模式,如:R13_,R14_;其中:可以从usr、svc、abt、und、irq和fiq六种模式中选取一个。
    • 寄存器R13通常用作堆栈指针,称作SP。每种异常模式都有自己的分组R13。通常R13应当被初始化成指向异常模式分配的堆栈。在入口处,异常处理程序将用到的其他寄存器的值保存到堆栈中;返回时,重新将这些值加载到寄存器。这种异常处理方法保证了异常出现后不会导致执行程序的状态不可靠。
    • 寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。当执行带链接分支(BL)指令时,得到R15的备份。 在其他情况下,将R14当做通用寄存器。类似地,当中断或异常出现时,或当中断或异常程序执行BL指令时,相应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。
    • FIQ模式有7个分组的寄存器R8~R14,映射为R8_fiq-R14_fiq。在ARM状态下,许多FIQ处理没必要保存任何寄存器。User、IRQ、Supervisor、Abort和Undefined模式每一种都包含两个分组的寄存器R13和R14的映射,允许每种模式都有自己的堆栈和链接寄存器。
3 程序计数器R15

寄存器R15用作程序计数器(PC)。在ARM状态,位[1:0]为0,位[31:2]保存PC。在Thumb状态,位[0]为0,位[31:1]保存PC。R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。

  1. 读程序计数器。指令读出的R15的值是指令地址加上8字节。由于ARM指令始终是字对齐的,所以读出结果值的位[1:0]总是0(在Thumb状态下,情况有所变化)。读PC主要用于快速地对临近的指令和数据进行位置无关寻址,包括程序中的位置无关转移。
  2. 写程序计数器。写R15的通常结果是将写到R15中的值作为指令地址,并以此地址发生转移。由于ARM指令要求字对齐,通常希望写到R15中值的位[1:0]=0b00。
  3. 由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值