首页 理论教育 程序状态寄存器与通用寄存器传送指令

程序状态寄存器与通用寄存器传送指令

时间:2023-11-23 理论教育 版权反馈
【摘要】:ARM 指令中有两条指令MSR 和MRS,用于在状态寄存器和通用寄存器之间传送数据。状态寄存器到通用寄存器的传送指令MRS 指令用于将状态寄存器CPSR 或SPSR 的内容传到通用寄存器Rd 中,它主要用于三种场合:①通过“读取—修改—写回”操作序列修改状态寄存器的内容。MRS 指令用于将状态寄存器的内容读到通用寄存器中;②当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。

程序状态寄存器与通用寄存器传送指令

ARM 指令中有两条指令MSR 和MRS,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取—修改—写回”三个步骤的操作来实现的。

(1)状态寄存器到通用寄存器的传送指令(MRS)

MRS 指令用于将状态寄存器CPSR 或SPSR 的内容传到通用寄存器Rd 中,它主要用于三种场合:①通过“读取—修改—写回”操作序列修改状态寄存器的内容。 MRS 指令用于将状态寄存器的内容读到通用寄存器中;②当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。 这时,需要先通过MRS 指令读出SPSR的值,再用其他指令将SPSR 值保存起来;③当进程切换时,也需要保存当前寄存器值。

1)指令格式

2)注意事项

由于用户或系统模式下没有可访问的SPSR,所以SPSR 形式在这些模式不能用,MRS 指令不影响条件标志码。

(2)通用寄存器到状态寄存器的传送指令(MSR)

当需要保存或修改当前模式下CPSR 或SPSR 的内容时,这些内容首先必须传送到通用寄存器中,对选择的位进行修改,然后将数据回写到状态寄存器。 这里讲述的指令完成这一过程的最后一步,即用立即数常量或通用寄存器的内容加载CPSR 或SPSR 的指定区域。

MRS 和MSR 配合使用,作为更新PSR 的“读取—修改—写回”序列的一部分。

1)指令格式:

这里<field>表示下列情况之一:

①c:控制域—PSR[7:0]。

②x:扩展域—PSR[15:8](在当前ARM 中未使用)。

③s:状态域—PSR[23:16](在当前ARM 中未使用)。(www.xing528.com)

④f:标志位域—PSR[31:24]。

<immediate>为有效立即数,Rm 为操作数寄存器。

MSR 指令举例如下:

设置N、Z、C 和V 标志位:

MSR    CPSR_f,#&f0000000 ; 设置所有的标志位

仅设置C 标志位,保存N、Z 和V:

从监控模式切换到IRQ 模式(例如,启动时初始化IRQ 堆栈指针):

在这种情况下,需要拷贝原来CPSR 的值,以便不改变中断使能设置。 上面的代码可以用来在任何两个非用户模式之间或从非用户模式到用户模式的切换。 只有在MSR 完成后,模式的改变才起作用;在将结果拷贝回CPSR 之前,中间的工作对模式没有影响。

2)注意事项:

①在用户模式下不能对CPSR[23:0]作任何修改。

②在用户或系统模式下没有SPSR,故应尽量避免在这些模式下访问SPSR。

③不能通过该指令直接修改CPSR 中的T,控制位直接将程序状态切换到Thumb 状态,必须通过BX 等指令来完成程序状态的切换。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈