OK6410---寄存器

目录

1 ARM状态核心寄存器集

2 程序状态寄存器

2.1 条件代码标志

2.2 Q标志位

2.3 J标志位

2.4 GE[3:0]位

2.5 E标志位

2.6 A标志位

2.7 控制位

 2.8 MRS和MSR指令


 参考:ARM1176JZF-S™ Revision: r0p7 Technical Reference Manual

该处理器(ARM1176JZF-S)共有40个寄存器:

  • 33个通用32位寄存器
  • 7个32位状态寄存器

这些寄存器不能同时全部访问。处理器状态和操作模式决定了可供程序员使用的寄存器。

1 ARM状态核心寄存器集

在ARM状态下,可随时访问16个通用寄存器和一个或两个状态寄存器。在特权模式下,模式特定的寄存器可用。下图显示了每种模式下可用的寄存器:

ARM状态核心寄存器集包含16个可直接访问的寄存器R0-R15。另一个寄存器,即当前程序状态寄存器(CPSR),包含条件代码标志,状态位和当前模式位。寄存器R0-R12是通用寄存器,用于保存数据或地址值。寄存器R13,R14,R15和备份的程序状态寄存器(SPSR)具有以下特殊功能:

  • 栈指针---寄存器R13用作栈指针(SP)。R13在不同的操作模式时有不同的分组寄存器,如R13_fiq,R13_svc等等。这意味着异常发生前后可以使用不同的栈空间。在许多指令中,您都可以将R13用作通用寄存器,但是该体系结构在大多数指令中均不赞成使用R13。
  • 连接寄存器---寄存器R14用作子程序连接寄存器或连接寄存器LR。当执行带链接的分支(BL或BLX)指令时,寄存器R14接收返回地址。您可以在所有其他时间将R14当作通用寄存器。相应的分组寄存器R14_mon,R14_svc,R14_irq,R14_fiq,R14_abt和R14_und类似地用于在出现中断和异常时,在中断或异常例程中执行BL或BLX指令时保存返回值。
  • 程序计数器---寄存器R15用作程序计数器PC。在ARM状态下,这是字对齐的;在Thumb状态下,这是半字对齐的;在Jazelle状态下,这是字节对齐的。它用于控制程序中指令的执行顺序。
  • 备份的程序状态寄存器---在特权模式下,可以访问另一个寄存器SPSR。当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可以由SPSR来恢复CPSR。

2 程序状态寄存器

该处理器包含一个CPSR和六个SPSR,供异常处理程序使用。程序状态寄存器:

  • 保存有关最近执行的ALU操作的信息
  • 控制中断的启用和禁用
  • 设置处理器操作模式

注意

上图标识为“请勿修改”(DNM),“读为零”(RAZ)的位不能用软件修改。这些位是:

  • 可读,以使处理器状态得以保留,例如,在进程上下文切换期间
  • 可写,以使处理器状态得以恢复。为了保持与未来ARM处理器的兼容性,并且作为一种良好实践,强烈建议您在更改CPSR时使用读-修改-写策略

2.1 条件代码标志

N,Z,C和V位是条件代码标志位。您可以通过算术和逻辑运算以及MSR和LDM指令进行设置。处理器测试这些标志位以确定是否执行指令。 

在ARM状态下,大多数指令可以根据N,Z,C和V位的状态有条件地执行。

但不包括以下的指令:

  • BKPT---BKPT(断点)导致出现软件断点。
  • CDP2---CDP(协处理器数据处理)告诉编号为cp_num的协处理器执行独立于ARM寄存器和内存的操作。CDP2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。生成的指令只能无条件执行。
  • CPS---cps(更改处理器状态)更改cpsr的一个或多个模式位(A、I和F位),而不更改其他cpsr位。
  • LDC2---LDC(加载协处理器)将内存数据从一系列连续的内存地址加载到协处理器。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。LDC2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。
  • MCR2---MCR(将ARM寄存器的值复制到协处理器)将寄存器<Rd>的值传递给编号为cp_num的协处理器。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。MCR2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。
  • MCRR2---MCRR(将两个ARM寄存器的值复制到协处理器)将两个ARM寄存器的值传递给协处理器。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。MCRR2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。
  • MRC2---MRC(将协处理器的值复制到ARM寄存器)使协处理器将值传输到ARM寄存器或条件标志。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。MRC2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。
  • MRRC2---MRRC(将协处理器的值复制到两个ARM寄存器)使协处理器将值传输到两个ARM寄存器。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。MRRC2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。
  • PLD---PLD(预加载数据)向存储系统发出信号,表明在不久的将来可能会从指定地址访问存储器。内存系统可以通过在发生访问时采取预期会加快内存访问速度的操作进行响应,例如将包含指定地址的缓存线预加载到缓存中。pld是一种提示指令,旨在优化存储系统的性能。它没有体系结构定义的效果,不支持此优化的内存系统可以忽略它。在这种存储系统上,PLD充当NOP。
  • SETEND---SETEND修改CPSR E位,而不更改CPSR中的任何其他位。
  • RFE---RFE(异常返回)分别从指定地址的字和后面的字加载PC和CPSR。
  • SRS---SRS(存储返回状态)将当前模式的R14和SPSR存储到指定地址的字和后面的字。该地址由属于指定模式的R13的分组版本确定。
  • STC2---STC(存储协处理器)将数据从协处理器存储到一系列连续的内存地址中。如果没有协处理器指示它们可以执行该指令,则会生成未定义指令异常。STC2使指令的条件字段设置为0b1111。这为协处理器设计人员提供了额外的操作码空间。产生的指令只能无条件执行。

在Thumb状态下,只能有条件地执行分支指令。有关条件执行的更多信息,请参见《 ARM体系结构参考手册》。

2.2 Q标志位

粘性溢出(Q)标志可以通过某些乘法和分数运算指令来设置:

  • QADD---QADD(饱和加法)执行整数加法。它将结果饱和到32位有符号整数范围–2^31 ≤ x ≤ 2^31–1。如果发生饱和,QADD将在CPSR中设置Q标志。
  •  QDADD---QDADD(Saturating Double and Add)将其第二个操作数加倍,然后将结果添加到其第一个操作数。加倍和加法的结果都饱和到32位有符号整数范围–2^31 ≤ x ≤ 2^31–1。如果在任一操作中均发生饱和,则该指令会在CPSR中设置Q标志。
  •  QSUB---QSUB(饱和减法)执行整数减法。它将结果饱和到32位有符号整数范围–2^31 ≤ x ≤ 2^31–1。如果发生饱和,QSUB将在CPSR中设置Q标志。
  • QDSUB---QDSUB(饱和双双倍减法)将其第二个操作数加倍,然后从其第一个操作数中减去结果。加倍和减法的结果都饱和到32位有符号整数范围–2^31 ≤ x ≤ 2^31–1。如果在任何一种操作中均发生饱和,则QDSUB会在CPSR中设置Q标志。
  • SMLAD---SMLAD(Signed Multiply Accumulate Dual)执行两个带符号的16 x 16位乘法。它将乘积添加到32位累加操作数中。(可选)您可以在执行算术运算之前交换第二个操作数的半字。这将产生top x bottom和bottom x top乘法。如果累加操作溢出,该指令将设置Q标志。乘法过程中不会发生溢出。
  • SMLAxy---SMLA <x> <y>(带符号的乘法累加BB,BT,TB和TT)执行带符号的乘法累加运算。乘法作用于两个带符号的16位量,取自它们各自源寄存器的下半部或上半部。这些源寄存器的其他一半将被忽略。将32位乘积加到32位累加值中,并将结果写入目标寄存器。如果在累加值累加期间发生溢出,该指令将在CPSR中设置Q标志。在乘法过程中不可能发生溢出。
  • SMLAWy---SMLAW <y>(有符号乘法累加字B和T)执行有符号乘法累加运算。乘法作用于有符号的32位量和有符号的16位量,后者取自其源寄存器的下半部或上半部。第二个源寄存器的另一半被忽略。将48位乘积的高32位加到32位累加值中,并将结果写入目标寄存器。48位乘积的低16位将被忽略。如果在累加值累加期间发生溢出,该指令将在CPSR中设置Q标志。由于使用了48位乘积的高32位,因此在乘法过程中不会发生溢出。
  • SMLSD---SMLSD(Signed Multiply Subtract accumulate Dual)执行两个带符号的16 x 16位乘法。它将乘积的差值添加到32位累加操作数中。(可选)您可以在执行算术运算之前交换第二个操作数的半字。这将产生top x bottom和bottom x top乘法。如果累加操作溢出,该指令将设置Q标志。在乘法或减法期间不会发生溢出。
  • SMUAD---SMUAD(Signed Dual Multiply Add)执行两个带符号的16 x 16位乘法。它将产品相加,得出32位结果。(可选)您可以在执行算术运算之前交换第二个操作数的半字。这将产生top x bottom和bottom x top乘法。如果加法运算溢出,则该指令设置Q标志。乘法不会溢出。
  • SSAT---SSAT(Signed Saturate)将有符号值饱和到有符号范围。您可以选择发生饱和的位位置。您可以在饱和发生之前对值进行平移。如果操作饱和,则设置Q标志。
  • SSAT16---SSAT16将两个16位带符号的值饱和到一个带符号的范围。您可以选择发生饱和的位位置。如果任一半字操作饱和,则设置Q标志。
  • USAT---USAT(Unsigned Saturate)将有符号值饱和到无符号范围。您可以选择发生饱和的位位置。您可以在饱和发生之前对值进行平移。如果操作饱和,则设置Q标志。
  • USAT16---USAT16将两个带符号的16位值饱和到一个无符号范围。您可以选择发生饱和的位位置。如果任一半字操作饱和,则设置Q标志。

Q标志具有粘性,因为当被一条指令设置时,它一直保持设置状态,直到被写入CPSR的MSR指令明确清除为止。指令无法根据Q标志的状态有条件地执行。要确定Q标志的状态,您必须将PSR读入寄存器并从中提取Q标志。有关如何设置和清除Q标志的详细信息,请参见《 ARM体系结构参考手册》中的各个指令定义。

2.3 J标志位

CPSR中的J位指示处理器何时处于Jazelle状态。

  • 当J = 0时,取决于T位,处理器处于ARM或Thumb状态。
  • 当J = 1时,处理器处于Jazelle状态。

注意

  • J = 1和T = 1的组合导致类似于在没有Thumb的处理器上设置T = 1的效果。即,执行的下一条指令将导致进入“未定义指令”异常。进入异常处理程序会使处理器重新进入ARM状态,并且处理程序可以检测到这是导致异常的原因,因为J和T都在SPSR_und中设置。
  • MSR不能用于更改CPSR中的J位。
  • J位的设置避免了代码中的状态或扩展字节在ARMv5TE或更早版本的处理器上运行。这可以确保使用已弃用的cpsr、spsr、cpsr_all或spsr_all语法作为msr指令的目标来编写的操作系统代码继续工作。

2.4 GE[3:0]位

在ARMv6中,SIMD指令对结果的各个字节或半字使用bit [19:16]作为大于或等于(GE)标志。您可以使用这些标志来控制后续的SEL指令(SEL(选择)根据GE标志的值从其第一个操作数或第二个操作数中选择其结果的每个字节)。

对半字进行操作的指令:

  • 根据前半字的计算结果,一起置位或清除GE [3:2]
  • 根据后半字的计算结果,一起置位或清除GE [1:0]

对字节进行操作的指令:

  • 根据最高位字节计算的结果置位或清除GE [3]
  • 根据第二个字节的计算结果置位或清除GE [2]
  • 根据第三字节计算结果置位或清除GE [1]
  • 根据最低位字节计算的结果置值或清除GE [0]

如果相应的计算结果如下,则置位每个位(否则将其清除):

  • 用于无符号字节加法,如果结果大于或等于2^8
  • 用于无符号半字加法,如果结果大于或等于2^16
  • 对于无符号减法,如果结果大于或等于零
  • 对于带符号算术,如果结果大于或等于零

在ARMv6之前的体系结构版本中,必须将CPSR和SPSR的位[19:16]视为保留位。

2.5 E标志位

提供了ARM和Thumb指令来置位和清除E位。E位控制加载/存储的字节序。ARMv6之前的体系结构版本将此位指定为SBZ。这样可确保加载或存储上的字节顺序不反转。

2.6 A标志位

A位自动设置。它用于禁用不精确的数据中止。如果SCR寄存器中的AW位被复位,则在非安全环境中可能无法写入。

2.7 控制位

PSR的低八位统称为控制位。它们是:

  • 中断禁止位
  • T标志位
  • 模式位

发生异常时,控制位会发生变化。当处理器以特权模式运行时,软件可以操纵这些位。

中断禁止位

I和F位是中断禁止位:

  • 当I位置1时,IRQ中断被禁用
  • 当F位置1时,FIQ中断被禁用。如果将SCR寄存器中的FW位复位,则FIQ在非安全环境中可能是不可屏蔽的。

注意:

您可以在“非安全”环境中更改SPSR F位,但是如果SCR位4(FW)不允许这样做,则不会更新CPSR。

T标志位 

T位存在于ARMv4的t变体以及ARMv5及更高版本的所有变体中。在ARMv4的非T变体上,必须将T位视为保留位。Thumb指令集在ARMv4和ARMv5的T变体以及ARMv6及更高版本的所有变体上实现。在ARM和Thumb状态之间切换执行的指令可以在这些体系结构的实现上自由使用。Thumb指令集未在ARMv5的非T变体上实现。如果通过在这些体系结构变体上设置T == 1来选择Thumb指令集,则执行的下一条指令将导致未定义指令异常。在这些体系结构变体的实现上可以使用在ARM和Thumb状态之间切换执行的指令,但是只有在程序保持ARM状态的情况下,这些指令才能正确运行。如果程序尝试切换到Thumb状态,则该切换之后执行的第一条指令会导致未定义指令异常。然后进入该异常,然后切换回ARM状态。异常处理程序可以从SPSR_und的T位被置位的事实中检测到这是导致异常的原因。

T位反映了运行状态:

  • 当T位置1时,处理器以Thumb状态执行
  • 当T位清零时,处理器将依赖J位,在ARM状态或Jazelle状态下执行。

注意:

切勿使用MSR指令强行更改CPSR中T位的状态。如果MSR指令确实尝试修改此位,则结果在架构上是不可预测的。在ARM1176JZF-S处理器中,此位不受影响。 

模式位 

M[4:0]是模式位。下图列出不同模式时可以使用的寄存器:

 2.8 MRS和MSR指令

  • MRS(将PSR的值传输到通用寄存器)将当前模式的CPSR或SPSR的值复制到通用寄存器中。在通用寄存器中,可以使用常规数据处理指令来检查或操纵该值。
  • MSR(从ARM寄存器的复制到状态寄存器)将通用寄存器的值或立即数传输到当前模式的CPSR或SPSR。

语法如下:

MRS{<cond>} <Rd>, CPSR

MRS{<cond>} <Rd>, SPSR

<cond> --- 是执行指令的条件。 如果省略<cond>,则使用指令始终执行。

<Rd> --- 指定目标寄存器。如果为<Rd>指定R15,则结果为UNPREDICTABLE。

MSR{<cond>} CPSR_<fields>, #<immediate> 
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate> 
MSR{<cond>} SPSR_<fields>, <Rm>

<cond> ---  是执行指令的条件。 如果省略<cond>,则使用指令始终执行。

<fields> --- 是位域。如CPSR_c,CPSR_cxsf都是正确的表达式,具体表示如下:

  • c --- 控制位域,位[7:0]
  • x --- 扩展位域,位[15:8]
  • s --- 状态位域,位[23:16]
  • f --- 条件标志位域,位[31:24]

<immediate> --- 是要传输到CPSR或SPSR的立即数。允许的立即数值为8位立即数(范围为0x00至0xFF)。

<Rm> --- 是要传输值到CPSR或SPSR的通用寄存器。

 这些指令一般用在以下情况:当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用MRS指令读出程序状态寄存器的值,然后保存。当需要改变程序状态寄存器的内容时,可用MRS指令将程序状态寄存器的内容读入通用寄存器,修改后将该值用MSR指令写回程序状态寄存器。

使用注意:

  1. 只有在特权模式下才可以改变处理器模式和设置中断。
  2. 程序状态寄存器中的T位用于指示ARM状态和Thumb状态的转换,但程序不能通过修改T位实现ARM和Thumb之间的转换。任何情况下不得修改T位。
  3. 不可以使用R15做目标寄存器。
发布了27 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/drsonxu/article/details/101562206
今日推荐