ARM寄存器概述、AArch32下的寄存器组织(ARM处理器架构模型——寄存器组织,上篇)
本文声明:内容来源于网络,进行整合/再创作;部分内容由AI辅助生成。
Tips:本节知识分为上、中、下篇讲述,可通过专栏查找到对应文章。
ARM 寄存器概述
ARMv8架构属于64位架构,向下兼容ARMv7架构。ARMv8架构支持两种类型的ARM指令集,一种是AArch64位指令集,另一种是AArch32位指令集。上述类型的ARM指令集,每条指令都是字(4字节,32位)对齐。两种类型指令集的本质区别是工作寄存器的位数不同:AArch32位指令集使用32位工作寄存器,而Arch64位指令集使用64位工作寄存器。
ARM微处理器中的寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决于微处理器的工作状态及具体的运行模式。不过,在任何时候,通用寄存器、1~2个状态寄存器(CPSR/SPSR)都是可被访问的。
在所有的寄存器中,有些是在处理器的多种运行模式下共用同一个物理寄存器,有些是在不同运行模式下有不同的物理寄存器。ARMv8架构的处理器为了更好向下兼容ARMv7架构,支持AArch32和AArch64两种执行状态,在不同的执行状态下使用不同的寄存器组织。
AArch32(A32) 状态下的寄存器组织
通用寄存器用R0~R15表示,可以分为3类。在汇编语言,通用寄存器中用于关于,不会因体系结构的不同而作为特殊用途,几乎所有关于允许使用通用寄存器的指令都能用在通用寄存器上。
![]()
ARMv8架构——A32状态下的寄存器组织【(表格同一行)空格表示,指向同个物理寄存器】
1、未分组寄存器R0~R7
在所有处理器运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途。因此,处理器在中断或异常处理程序中(通常进行处理器运行模式转换),由于不同运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应注意一般都需要对这几个寄存器的值进行保存。
2、分组寄存器R8~R14
对于分组寄存器,它们每次所访问的物理寄存器与处理器当前的运行模式有关。
- R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。
- R13、R14分别有8个、7个分组的物理寄存器。这些分组的其中一个用户和系统模式共用,其余的分别用于异常模式。
R13常用作堆栈指针SP
这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。但是在Thumb指令集中,某些指令强制性的要求使用R13作为SP。
通常在系统初始化时需要对所有运行模式下的SP进行赋值,当处理器在不同运行模式时,SP会被自动切换成相应运行模式下的值。
关于堆栈与堆栈指针SP的一些说明:
堆栈用于保存程序切换前的重要数据(如CPSR、SPSR_xxx、LR_xxx、需要保存的Rn等),出入栈操作遵循“后进先出(LIFO)”。
堆栈指针是指向堆栈顶部存储单元的地址,用于子程序(子函数)中。进入子程序后执行入栈操作,返回主程序前执行出栈操作,就能回到主程序原来的工作状态。子程序分两种:调用子程序、中断子程序。
R14 用于(子程序)链接寄存器LR
在调用子程序时,用于保存子程序的返回地址;在发生异常时,用于保存异常返回地址。
寄存器R14与子程序调用(汇编指令举例):
①程序A执行过程中调用程序B。
②程序跳转至标号Lable,执行程序B;同时硬件将“BL Lable”指令的下一条指令所在地址存入R14。
③程序B执行最后,将R14寄存器的内容放入PC,返回程序A。

寄存器R14与异常发生:
异常发生时,当前程序要跳转至对应的异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于部分异常有较小的固定偏移量。
R14注意要点——当发生异常嵌套时,这些异常之间可能会发生寄存器保存返回地址的冲突。
例如,在USR模式下执行程序时发生了IRQ中断,硬件将返回地址存入IRQ模式下的R14_irq寄存器,USR模式下的R14没有被破坏;IRQ服务程序执行完毕后,将R14_irq的内容减去某常量后存入PC,返回之前被中断的程序。
如果在IRQ处理程序中重新使能IRQ中断,并且再次发生IRQ中断(嵌套中断)或调用子程序,硬件将此时的返回地址保存在R14_irq寄存器中,覆盖原先保存的返回地址,造成错误,导致无法正确返回到最初执行的程序。
解决办法:确保R14对应的异常链接寄存器在发生中断嵌套时,不再保存任何有意义的值(将R14入栈),或者使处理器切换到其它运行模式下。
3、R15(程序计数器PC)
一般将R15用作程序计数器(PC)——存放待取指令的地址。
- 读程序计数器:由于ARM体系结构采用了多级流水线技术,对于AArch32指令而言,PC一般指向当前执行指令的下2条指令的地址,即读出的PC(R15)的值是当前指令的地址值+8(字节)。
- 写程序计数器:写入R15的结果通常是,将写到R15中的值作为指令地址,并以此地址发生转移。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)