首页>>科技 >>内容

arm寄存器组有几个状态寄存器,ARM通用寄存器及状态寄存器详解

发布时间:2023-07-18 14:38:39编辑:温柔的背包来源:

很多朋友对arm寄存器组有几个状态寄存器,ARM通用寄存器及状态寄存器详解不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

arm寄存器组有几个状态寄存器,ARM通用寄存器及状态寄存器详解

笔者将讲一下ARM通用寄存器和状态寄存器的知识和理解。

ARM 通用寄存器

对于处理器来说,寄存器可以作为暂存器来存储临时结果,也可以作为输入数据以方便运算,也可以作为访问内存的索引,其功能多种多样。

皮质M3/M4

CortexM3/M4是比较常用的ARM架构。很多厂商都采用了这种架构,比如广受大家欢迎的ST的stm32,以及在Freescale比赛中一直很受欢迎的NXP的MK60芯片。国内兆易创新的GD32、亚特力的AT32、国民技术的N32系列。

它在嵌入式领域非常流行,比较好用,功能齐全,可以满足MCU的一般需求。

其寄存器模型如下:

通用寄存器R0-R7

、低组寄存器、32位、16位thumb和32位thumb-2指令均可访问

可以看到R0和R:1、R2作为参数传入。

随后将R0作为结果传递出去进行比较。

传入的参数是一个数组,为什么不直接传递地址(LDR),而是通过DCD指令传递呢?

这是因为LDR地址的范围是有限的,LDR Rn,#immediate地址,地址只有一个很小的范围(4KB?),所以可以看到DCD的地址并不远(6A92 - 6D48也不远) away),内存的地址在2000000范围内,与其地址相差较大。从图2看DCD之后的地址,实际上是先通过DCD的地址进行寻址,然后作为地址继续寻址。

R0-R3 一般作为参数传递。如果参数较多,则通过压栈的方式传递

R0 和R1 也将作为返回值传递。如果是32位的话就用R0,如果是64位的话就用R0-R1

通用寄存器R8-R12

,高组寄存器,32bit,较少可以访问16位thumb指令,一般是thumb-2指令。

R11一般用作FP指针,保存栈帧(添加编译选项时,见上一篇文章,下面的SP和LR类似于ARM开发中的几个常用寄存器的详细解释)。

堆栈指针R13(SP)指示当前堆栈的位置。

链接寄存器R14(LR)保存程序返回地址。

程序计数器R15 (PC)

程序运行的当前位置。

下图中,以一个PC作为基地址,然后访问内存,0x4079a1c+480=0x4079c04

下图2直接使用0x4079c04作为r0的地址

指令对齐半字或字地址,最低位为0

对于特殊的跳转指令,PC的最低位需要代表Thumb状态,否则会触发异常。

PC有时作为基地址寄存器,然后加上地址偏移量来访问数据

皮质R5

Cortex R系列继承了ARM7架构下的系统模型,具有多组工作模式,并且每种模式都有自己的地址空间(堆栈地址SP)

CortexR5属于ARMv7指令集。

与CortexM3/4一致,R0-R7和R8-R12的作用

用户模式和sys模式共享一组寄存器,即共享

在user/sys中,FIQ、SVC、ABT、IRQ和UND模式中,LR、SP和SPSR是独立的。切换CPSR模式后,SP、LR、SPSR自动切换为对应模式下的寄存器值

FIQ之所以被称为快速中断,是因为有独立的R8-R12寄存器,不需要压栈,直接使用。

SPSR是保存先前模式的CPSR。

ARMv7的通用AR系列的寄存器模型与上面基本相同,有一些新的扩展,

新增Hyp模式和Mon模式,分别用于虚拟扩展和安全扩展,

Hyp模式下的LR为ELR,记录异常发生时的返回地址,其他相同。

皮质A53

r0-r7用于传递参数或发回结果。

r8 间接结果位置寄存器

r9-r15 暂存器保存临时结果

r16-r17 动态链接所需的寄存器(并非系统中所有地址都可以跳转)(在链接器内部插入代码)

r18 平台ABI 特定寄存器,用于保存内部程序状态(为了平台通用性而避免)

r19-r28 被调用者保存的寄存器(相对而言,调用者保存的寄存器在CortexM3/4 中得到了很好的体现)

r29 FP寄存器,需要添加编译选项

r30链接寄存器

SP堆栈指针,

PC程序寄存器,可以看到程序调用时,函数类型为9个参数,汇编代码x0-x7作为参数传入,最后一个参数压栈传递,str x9,[SP ]。也是利用blr通过寄存器进行链接跳转,最后通过b跳转返回。

状态寄存器

该寄存器通常为CPSR(当前程序状态寄存器),用于指示当前程序运行状态、模式、运算结果状态、中断状态等,如下面的CPSR寄存器模型。

旗场

说明解释:表示程序运行结果的状态,可用于跳转,例如:结果是否为0、结果是否有进位、结果是否溢出、结果是否为负等。

符号为NCVZ,分别是负号(Negative)、进位(Carry)、溢出(Overflow)、0(Zero)符号。

衍生出很多跳转指令,在near范围或者函数范围内跳转,比如下面的指令

BEQ和BNE跳转通过判断Z==1,BEQ相等,如CMP X0,X1 BEQ

BCS和BCC判断C==1,BCS大于等于则跳转,BCC小于则跳转

BMI和MBL判断N==1,如果BMI为负数则跳转,如果BPL为整数则跳转

BVS和BVC判断V==1,溢出则跳转,BVC非溢出则跳转

BHI和BLS判断C==1且Z==0,大于则跳转,

BGE和BLT判断N==1和V==1,或者N==0和V==0有符号数大于或等于

BGT、BLE 通过判断Z=0、N==1 和V==1 或Z=0 N==0 和V==0 有符号数是否大于

相对数运算对标志位的影响。

中止控制域

例如,常见的DAIF中断屏蔽位有:

处理器状态调试中断屏蔽位:查看点、断点和系统单步运行

系统错误中断屏蔽位(通常是异步错误)

正常中断屏蔽

快速中断屏蔽位的常用中断控制域如上图所示,

CortexM3/4有独立的寄存器primmask,可以屏蔽中断,只有普通中断,没有快速中断(支持嵌套,所以快不快并不重要,同时进入中断后,硬件自动压入相关寄存器,也提高了中断速度),cpsr中没有中断屏蔽相关,

CortexR5和A53系列都有这样的中断控制域,可以在访问关键资源时屏蔽中断。

模式控制域

CPSR的低五位是模式控制位,控制当前CPU处于什么模式。设置各种模式是为了处理异常和分级管理。对特定资源的低级访问是不可能的,而特权模式可以对资源进行操作。

通过写CPSR的低五位,可以控制系统处于哪种模式。

通过读取CPSR的第五位,还可以知道当前处于哪种模式,并判断程序发生了什么故障。

modedescriptionrestriction用户模式以非特权模式运行用户程序,无法处理异常。除非有例外,否则无法更改当前模式来限制对系统资源(外设和内存)的访问。 SVC模式用于系统管理,例如系统下的资源访问,以及可以由软件触发OS的调度管理。在特权模式下,执行SVC指令可以进入该异常,复位后进入该模式。 (正常行为,由软件触发)系统模式与用户模式共享所有寄存器。特权模式不能通过异常进入,(正常行为,软件触发)Abort Mode Data Abort 或Prefetch Abort,前者是数据访问错误,后面是取指令错误,特权模式,(异常行为,硬件检测)未定义模式指令相关异常处理,如执行到未定义指令、特权模式、(异常行为、硬件检测) FIQ Mode 特权模式、处理快速中断、(正常行为、硬件触发) IRQ Mode 特权模式、处理普通终端、(正常行为,硬件触发)命令选择字段

T Value 指令集描述0 ARM 指令集32 位DWORD 对齐指令1 Thumb 指令集部分为16 位半字(half word)对齐指令,增加代码密度,减小Image sizeX 关联这两个指令集可用于组合,通过状态表示,例如通过bx和blx,可以切换指令集endian控制域

Endian 状态值模式说明设置指令0 Little-Endian 模式存储器低字节低位SETEND LE1 Big-Endian 模式存储器高位低字节SETEND BE 执行状态控制字段

一些控制系统状态的标志,例如ARMv8-A系列

标志属性说明HTMLSP_ELxStack指针寄存器选择,'如SP_EL0或SP_EL3EL'异常级别'“EL0,EL:1、EL2和EL3” SS软件单步控制用于调试器使PE单步指令审计唐子宏

以上知识分享希望能够帮助到大家!