飞道的博客

【ARM】Programmers Model

535人阅读  评论(0)

00. 目录

01. ARM数据类型

ARM 采用的是 32 位架构,ARM 的基本数据类型有以下3种。

  • Byte:字节,8bit。
  • Halfword:半字,16bit(半字必须与 2 字节边界对齐)。
  • Word:字,32bit(字必须与 4 字节边界对齐)。

注意:

(1)ARM 系统结构 v4 以上版本支持以上 3 种数据类型,v4 以前版本仅支持字节和字。
(2)当将这些数据类型中的任意一种声明成 unsigned 类型时,n 位数据值表示范围为 0~2^n −1的非负数,通常使用二进制格式。
(3)当将这些数据类型的任意一种声明成 signed 类型时,n 位数据值表示范围为−2^(n−1) ~2^(n−1) −1的整数,使用二进制的补码格式。
(4)所有数据类型指令的操作数都是字类型的,如“ADD r1,r0,#0x1”中的操作数“0x1”就是以字类型数据处理的。
(5)Load/Store 数据传输指令可以从存储器存取传输数据,这些数据可以是字节、半字、字。加载时自动进行字节或半字的零扩展或符号扩展。对应的指令分别为 LDR/BSTRB(字节操作)、LDRH/STRH(半字操作)、LDR/STR(字操作)。详见后面的指令参考。
(6)ARM 指令编译后是 4 字节(与字边界对齐)。Thumb 指令编译后是 2 字节(与半字边界对齐)。

02. 浮点数据类型

浮点运算使用在 ARM 硬件指令集中未定义的数据类型。尽管如此,但 ARM 公司在协处理器指令空间定义了一系列浮点指令。通常这些

指令全部可以通过未定义指令异常(此异常收集所有硬件协处理器不接受的协处理器指令)在软件中实现,但是其中的一小部分也可以由

浮点运算协处理器 FPA10 以硬件方式实现。另外,ARM 公司还提供了用 C 语言编写的浮点库作为 ARM 浮点指令集的替代方法(Thumb

代码只能使用浮点指令集)。该库支持 IEEE 标准的单精度和双精度格式。C 编译器有一个关键字标志来选择这个历程。它产生的代码与

软件仿真(通过避免中断、译码和浮点指令仿真)相比既快又紧凑。

03. 处理器模式

除用户模式外的其他 7 种处理器模式称为特权模式(Privileged Modes)。在特权模式下,程序可以访问所有的系统资源,也可以任意地

进行处理器模式切换。其中以下 6 种又称为异常模式:

(1)快速中断模式(FIQ)。

(2)外部中断模式(IRQ)。

(3)特权模式(Supervior)。

(4)数据访问中止模式(Abort)。

(5)未定义指令中止模式(Undef)。

(6)监控模式(Monitor)。

处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。

大多数的用户程序运行在用户模式下。当处理器工作在用户模式时,应用程序不能访问受操作系统保护的一些系统资源,应用程序也不能

直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体

系结构可以使操作系统控制整个系统资源的使用。当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有一

组专用寄存器以供相应的异常处理程序使用,这样就可以保证在进入异常模式时用户模式下的寄存器(保存程序运行状态)不被破坏。

04. 寄存器

ARM 处理器有如下 40 个 32 位长的寄存器。

(1)33 个通用寄存器。

(2)6 个状态寄存器:1 个 CPSR(Current Program Status Register,当前程序状态寄存器),5 个 SPSR(Saved Program Status

Register,备份程序状态寄存器)。

(3)1 个 PC(Program Counter,程序计数器)。

ARM 处理器共有 7 种不同的处理器模式,在每一种处理器模式中都有一组相应的寄存器组,下图 列出了 ARM 处理器的寄存器组织概

要。

当前处理器的模式决定着哪组寄存器可操作,任何模式都可以存取下列寄存器。

(1)相应的 R0~R12。

(2)相应的R13(Stack Pointer,SP,栈指向)和R14(the Link Register,LR,链路寄存器)。

(3)相应的 R15(PC)。

(4)相应的 CPSR。

特权模式(除 System 模式外)还可以存取相应的 SPSR。

通用寄存器根据其分组与否可分为以下两类。

(1)未分组寄存器(Unbanked Register),包括 R0~R7。

(2)分组寄存器(Banked Register),包括 R8~R14。

未分组寄存器
未分组寄存器包括 R0~R7。顾名思义,在所有处理器模式下对于每一个未分组寄存器来说,指的都是同一个物理寄存器。未分组寄存器

没有被系统用于特殊的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。但由于其通用性,在异常中断所引起的处理器

模式切换时,其使用的是相同的物理寄存器,所以也就很容易使寄存器中的数据被破坏。

分组寄存器
R8~R14 是分组寄存器,它们每一个访问的物理寄存器取决于当前的处理器模式。对于分组寄存器 R8~R12 来说,每个寄存器对应两个

不同的物理寄存器。一组用于除FIQ 模式外的所有处理器模式,而另一组则专门用于 FIQ 模式。这样的结构设计有利于加快 FIQ 的处理速

度。不同模式下寄存器的使用,要使用寄存器名后缀加以区分。例如,当使用 FIQ 模式下的寄存器时,寄存器 R8 和寄存器 R9 分别记为

R8_fiq、R9_fiq;当使用用户模式下的寄存器时,寄存器 R8 和 R9 分别记为 R8_usr、R9_usr 等。在 ARM 体系结构中,R8~R12 没有任

何指定的其他的用途,所以当 FIQ 中断到达时,不用保存这些通用寄存器,也就是说,FIQ 处理程序可以不必执行保存和恢复中断现场的

指令,从而可以使中断处理过程非常迅速。所以 FIQ 模式常被用来处理一些时间紧急的任务,如 DMA 处理。对于分组寄存器 R13 和 R14

来说,每个寄存器对应 6 个不同的物理寄存器。其中的一个是用户模式和系统模式公用的,而另外 5 个分别用于 5 种异常模式。访问时

需要指定它们的模式。名字形式如下:

(1)R13_<mode>

(2)R14_<mode>
其中,<mode>可以是以下几种模式之一:usr、svc、abt、und、irp、fiq 及 mon。R13 寄存器在 ARM 处理器中常用作堆栈指针,称为

SP。当然,这只是一种习惯用法,并没有任何指令强制性的使用 R13 作为堆栈指针,用户完全可以使用其他寄存器作为堆栈指针。而在

Thumb 指令集中,有一些指令强制性地将 R13 作为堆栈指针,如堆栈操作指令。每一种异常模式拥有自己的 R13。异常处理程序负责初

始化自己的 R13,使其指向该异常模式专用的栈地址。在异常处理程序入口处,将用到的其他寄存器的值保存在堆栈中,返回时,重新将

这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场。寄存器 R14 又被称为连接寄存器(Link

Register,LR),在 ARM 体系结构中具有下面两种特殊的作用。

(1)每一种处理器模式用自己的 R14 存放当前子程序的返回地址。当通过 BL 或 BLX指令调用子程序时,R14 被设置成该子程序的返回

地址。在子程序返回时,把 R14 的值复制到程序计数器(PC)。典型的做法是使用下列两种方法之一。

① 执行下面任何一条指令。

MOV PC, LR
BX LR

② 在子程序入口处使用下面的指令将 PC 保存到堆栈中。

STMFD SP!, {<register>,LR}

在子程序返回时,使用如下相应的配套指令返回。

LDMFD SP!, {<register>,PC}

(2)当异常中断发生时,该异常模式特定的物理寄存器 R14 被设置成该异常模式的返回地址,对于有些模式 R14 的值可能与返回地址有

一个常数的偏移量(如数据异常使用SUB PC,LR,#8 返回)。具体的返回方式与上面的子程序返回方式基本相同,但使用的指令稍微有

些不同,以保证当异常出现时正在执行的程序的状态被完整保存。R14 也可以被用作通用寄存器使用。

05. 程序状态寄存器

当前程序状态寄存器(Current Program Status Register,CPSR)可以在任何处理器模式下被访问,它包含下列内容:

(1)ALU(Arithmetic Logic Unit,算术逻辑单元)状态标志的备份。

(2)当前的处理器模式。

(3)中断使能标志。

(4)设置处理器的状态。

每一种处理器模式下都有一个专用的物理寄存器做备份程序状态寄存器(SavedProgram Status Register,SPSR)。当特定的异常中断

发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。CPSR

寄存器(和保存它的 SPSR 寄存器)中的位分配如下图所示。

下面给出各个状态位的定义。

1.标志位

N(Negative)、Z(Zero)、C(Carry)和 V(oVerflow)通称为条件标志位。这些条件标志位会根据程序中的算术指令或逻辑指令的

执行结果进行修改,而且这些条件标志位可由大多数指令检测以决定指令是否执行。在 ARM 4T 架构中,所有的 ARM 指令都可以条件执

行,而 Thumb 指令却不能。各条件标志位的具体含义如下。

1)N

本位设置成当前指令运行结果的 bit[31]的值。当两个由补码表示的有符号整数运算时,N = 1 表示运算的结果为负数,N = 0 表示结果为

正数或零。

2)Z

Z = 1 表示运算的结果为零,Z = 0 表示运算的结果不为零。

3)C

下面分 4 种情况讨论 C 的设置方法。

(1)在加法指令中(包括比较指令 CMN),当结果产生了进位,则 C = 1,表示无符号数运算发生上溢出;其他情况下 C = 0。

(2)在减法指令中(包括比较指令 CMP),当运算中发生错位(即无符号数运算发生下溢出),则 C = 0;其他情况下 C = 1。

(3)对于在操作数中包含移位操作的运算指令(非加/减法指令),C 被设置成被移位寄存器最后移出去的位。

(4)对于其他非加/减法运算指令,C 的值通常不受影响。

4)V

下面分两种情况讨论 V 的设置方法。

(1)对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,且运算结果超出了有符号运算的范围是溢出。

V = 1 表示符号位溢出。

(2)对于非加/减法指令,通常不改变标志位 V 的值(具体可参照 ARM 指令手册)。尽管以上 C 和 V 的定义看起来颇为复杂,但使用时

在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。

2.Q 标志位

在带 DSP 指令扩展的 ARM v5 及更高版本中,bit[27]被指定用于指示增强的 DAP 指令是否发生了溢出,因此也就被称为 Q 标志位。同

样,在 SPSR 中 bit[27]也被称为 Q 标志位,用于在异常中断发生时保存和恢复 CPSR 中的 Q 标志位。在 ARM v5 以前的版本及 ARM v5

的非 E 系列处理器中,Q 标志位没有被定义,属于待扩展的位。

3.控制位

CPSR 的低 8 位(I、F、T 及 M[4:0])统称为控制位。当异常发生时,这些位的值将发生相应的变化。另外,如果在特权模式下,也可以

通过软件编程来修改这些位的值。

1)中断禁止位

I = 1,IRQ 被禁止。

F = 1,FIQ 被禁止。

2)状态控制位

T 位是处理器的状态控制位。

T = 0,处理器处于 ARM 状态(即正在执行 32 位的 ARM 指令)。

T = 1,处理器处于 Thumb 状态(即正在执行 16 位的 Thumb 指令)。

当然,T 位只有在 T 系列的 ARM 处理器上才有效,在非 T 系列的 ARM 版本中,T 位将始终为 0。

3)模式控制位

M[4:0]作为位模式控制位,这些位的组合确定了处理器处于哪种状态,下图列出了其具体含义。

只有表中列出的组合是有效的,其他组合无效。

4.IF-THEN 标志位

CPSR 中的 bits[15:10,26:25]称为 if-then 标志位,它用于对 thumb 指令集中 if-then-else这一类语句块的控制。其中 IT[7:5]定义为基本

条件,如下图所示。IT[4:0]被定义为 IF-THEN 语句块的长度。

5.E 位/A 位/GE[19-16]位的定义

A 表示异步异常禁止位。

E 表示大小端控制位,0 表示小端操作,1 表示大端操作。注意,该位在预取阶段是被忽略的。

GE[19-16]用于表示在 SIMD 指令集中的大于、等于标志。在任何模式下该位可读可写。

06. 附录

6.1 ARM官方网站: https://developer.arm.com/

6.2 ARM Architecture Reference Manual


转载:https://blog.csdn.net/dengjin20104042056/article/details/106788385
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场