本文转载自:智能软件研究中心
上一节中我们学习了ARM汇编指令集的有关知识,这一节我们主要学习ARM架构寄存器的有关知识。在处理器中,寄存器用于保存需要被快速访问的数据,在操作系统中需要特别注意的寄存器主要有栈指针寄存器(SP)、连接寄存器(LR)、程序计数器(PC)以及当前程序状态寄存器(CPSR)和保存程序状态寄存器(SPSR)。本小节主要以ARMv8-A为例介绍ARM架构的寄存器的基本情况。详情可参见文献[1],D1.6小节。
一、AMRv8寄存器简介 在这一小节中,我们主要介绍ARMv8架构中AArch64执行状态下的寄存器使用情况。ARM架构中的寄存器主要有两类,一类用于提供系统控制与状态报告;另一类用于指令运行和异常处理。我们主要讨论第二类。 通用寄存器主要用于基本指令集中的指令运行,通用寄存器共有31个,编号为R0-R31。这些通用寄存器可以被当成31个64bit的寄存器,编号为X0-X30;或者被作为31个32bit的寄存器,编号为W0-W30。 在AArch64执行状态下,除了通用寄存器外,每一个异常级别都会有一个栈指针寄存器(StackPointer Register, SP),栈指针寄存器为SPEL0和SPEL1。异常级别用于区分指令的执行权限,我们将在本章的第四期介绍。如果处理器实现中包含EL2,那么还有SPEL2。如果处理器实现中包含EL3,那么还有SPEL3。详情可参考链接[5]。 SIMD和浮点寄存器共用一系列寄存器,这些寄存器会用于浮点操作、向量操作和其它SIMD有关的标量操作。SIMD指令是能够复制多个操作数、并把它们打包在大型寄存器的一组指令集[3]。以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。浮点寄存器和SIMD寄存器共包含32个128bit位宽的寄存器,V0-V31。这些寄存器可以作为:- 32个双字(64bit)寄存器,D0-D31。
- 32个单字(32bit)寄存器,S0-S31。
- 32个半字(16bit)寄存器,H0-H31。
- 32个单字(8bit)寄存器,B0-B31。
标志位 | 含义 |
N | 当两个有符号整数运算时:N=1表示运算的结果为负数;N=0表示运算的结果为正数或零。 |
Z | Z=1表示运算的结果为零,Z=0表示运算的结果非零。 |
C | 可以有4种方法设置C的值:
|
V | 对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号为溢出,通常其他指令不影响V位。 |
M[3:0]则用来确定异常级别和SP:
有关SPSR中各个位的详细信息可以参考文献[1] 1.6.4小节。 连接寄存器LR(R14) 的主要作用有两个: 1. 保存子程序返回地址,用MOVE指令或BX指令可以用于实现返回,如MOV PC、LR或BXLR。若子程序中还需要调用子程序,则可以写为: 第一条指令将LR中的内容入栈,最后一条将栈中保存的LR寄存器的内容存入PC中用于返回。 2. 当异常发生时,异常模式的LR用于保存异常返回地址,将LR内容入栈可以处理嵌套中断。 PC是程序计数器 ,其中保存的是正在被加载的指令,而不是正在被执行的指令。例如,若指令长度为4byte,则PC指向当前正在被执行的指令的地址+8byte的地址。关于LR和PC的详细内容可参考文献[6]和[7]。 以下是异常级别EL3中使用的寄存器的例图: ARM架构中处理器有不同的运行模式,因此同一个功能的寄存器在不同的运行模式下可能对应不同的物理寄存器,这些寄存器被称为备份寄存器。 如SPSR_svc表示svc模式下使用的SPSR寄存器。 ARM架构中常用的运行模式如下表所示[9]:处理器模式 | 描述 |
用户模式(User, usr) | 正常程序执行的模式 |
快速中断模式(FIQ, fiq) | 用于高速数据传输和通道处理 |
外部中断模式(IRQ, irq) | 用于通常的中断处理 |
特权模式(Supervisor, svc) | 供操作系统使用的一种保护模式 |
数据访问中止模式(Abort, abt) | 当数据或指令预取中止时进入该模式,用于虚拟存储及存储保护 |
未定义指令中止模式(Undefined, und) | 当执行未定义指令时进入该模式,用于支持通过软件仿真硬件的协处理器 |
系统模式(System, sys) | 用于运行特权级的操作系统任务 |
二、结语
本小节中我们简要介绍了有关ARMv8-A架构中操作系统里常用的寄存器的使用情况,需要注意的是寄存器的使用与处理器的异常级别也是息息相关的。我们将在下一期介绍ARMv8-A架构的异常级别。引用 [1]ARM® Architecture Reference ManualARMv8, for ARMv8-A architectureprofile [2]https://www.cnblogs.com/smartjourneys/p/6845078.html [3]https://baike.baidu.com/item/SIMD/3412835?fr=aladdin [4]http://www.lujun.org.cn/?p=1676 [5]https://www.cnblogs.com/pengdonglin137/p/10259971.html [6]https://blog.csdn.net/layuetian2011/article/details/52039328 [7]https://blog.csdn.net/allan0508/article/details/52624618 [8]https://blog.csdn.net/myarrow/article/details/9701499 [9]《ARM体系结构与编程(第二版)》,杜春雷主编。 ↓点击