DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1270|回复: 0
打印 上一主题 下一主题

[待整理] 协处理器及其他指令之:状态寄存器访问指令

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 07:29:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        9.2  状态寄存器访问指令

        ARM指令集提供了两条指令,可直接控制程序状态寄存器psr。MRS指令用于把cpsr或者spsr的值传送到一个寄存器;MSR与之相反,它将一个寄存器的内容传送到cpsr或者spsr。这两条指令结合,可用于对cpsr和spsr进行读/写操作。
         
        表9.2总结了状态寄存器访问指令。
        表9.2 状态寄存器访问指令
                                                                        助  记  符
                       
                                                                        含    义
                       
                                                                        操    作
                       
                                                                        MRS
                       
                                                                        将程序状态字寄存器的值送到通用寄存器
                       
                                                                        Rd=spr
                       
                                                                        MSR
                       
                                                                        将通用寄存器的值送到程序状态字寄存器
                       
                                                                        Psr[field]=Rm
                       
                                                                        MSR
                       
                                                                        将一个立即数送到程序状态字
                       
                                                                        Psr[field]=immediate
                       
         
        当需要保存或修改当前模式下CISR或SPSR的内容时,首先必须将这些内容传送到通用寄存器中,对选择的位进行修改,然后将数据回写到状态寄存器。对于ARM和Thumb的状态切换也是如此,程序不能通过直接改写CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。
         
        9.2.1  程序状态字内容送通用寄存器指令MRS

        1.指令编码格式

        读状态寄存器指令MRS。在ARM寄存器中,只有MRS指令可以将状态寄存器CPSR或SPSR读出到通用寄存器中。将程序状态字内容读取到通用寄存器中后就可以对其进行计算、修改等操作。
         
        指令的编码格式如图9.6所示。
       

        图9.6  MRS指令编码格式

         
        2.指令的语法格式

        MRS{<cond>}  <Rd>,CPSR
        MRS{<cond>}  <Rd>,SPSR
         
        ① <cond>
        为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条件执行(cond=AL(Alway))。
         
        ② <Rd>
        确定指令的目标寄存器。如果r15被用作目标寄存器,指令的执行结果不可预知。
         
        3.指令操作的伪代码

        指令操作的伪代码如下面程序段所示。
         
        If  ConditionPassed{cond}  then
             If  R==1  then
                  Rd=SPSR
             Else
                  Rd=CPSR
         
        4.指令的使用

        MRS指令注意用于以下3种场合:
        ·  当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传送到通用寄存器中,对选择的位进行修改,然后将数据回写到状态寄存器。
         
        ·  当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,再用其他指令(如压栈指令)将SPSR值保存起来。
         
        ·  在进程切换时也需要保存当前状态寄存器的值。
         
                                                                       
                       
                                                                        注意
                       
                                                                        在用户模式下对CPSR[23∶0]进行任何修改都是无效的。另外,尽量避免在用户模式或系统模式下访问SPSR,因为在这种模式下没有SPSR,如果执行此操作,指令的执行结果不可预知。
                       
         

        5.指令举例

        (1)将CPSR状态寄存器读取,保存到r1中。
         
        MRS   r1,CPSR
         
        (2)将SPSR状态寄存器读取,保存到r2中。
         
        MRS   r2,SPSR
         
        (3)MSR指令读取CPSR,用来判断ALU的状态标志或IRQ/FIQ中断是否允许等;在异常处理程序中,读SPSR可知道进入异常前的处理器状态等。MRS与MSR配合使用,实现CPSR或SPSR寄存器的读-修改-写操作,可用来进行处理器模式的切换或禁止/使能IRQ/FIQ中断等设置。另外,进行切换或允许异常中断嵌套时,也需要使用MRS指令读取SPSR状态值保存起来。
        下面的例子使能IRQ中断。
         
        ENABLE_IRQ
                 MRS    r0,CPSR
                 BIC    r0,r0,#0x80
                 MSR    CPSR_c,r0
                 MOV    PC,LR
         
        下面的例子禁止IRQ中断。
         
        DISABLE_IRQ
                MRS    r0,CPSR
                ORR    r0,r0,#0x80
                MSR    CPSR_c,r0
                MOV    PC,LR
         
        9.2.2  写状态寄存器指令MSR

        1.指令编码格式

        写状态寄存器指令MSR(Move to Status Register from ARM Register)。在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR。
         
        图9.7、图9.8分别显示了源操作数为立即数的MSR指令和源操作数为寄存器的MSR指令的编码格式。
       

        图9.7  源操作数为立即数的MSR指令编码格式

       

        图9.8  源操作数为寄存器的MSR指令编码格式

         
        2.指令的语法格式

        MSR{<cond>}   CPSR_<fields>,#<immediate>
        MSR{<cond>}   CPSR_<fields>,<Rm>
        MSR{<cond>}   SPSR_<fields>,#<immediate>
        MSR{<cond>}   SPSR_<fields>,<Rm>
         
        ① <cond>
        为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条件执行(cond=AL(Alway))。
         
        ② <fields>
        域标志位,是下面选项中的一种或几种的组合。
        ·  C:设置控制位掩码域(bit[16])。
        ·  X:设置扩展位掩码域(bit[17])。
        ·  S:设置状态位掩码域(bit[18])。
        ·  F:设置标志位掩码域(bit[19])
         
        ③ <immediate>
        将被传送到CPSR和SPSR寄存器的立即数。此立即数可以为8位立即数(范围在0x00~0xff之间)。
         
        ④ <Rm>
        指定的通用寄存器,此寄存器包含将要被传送状态寄存器中的数据。
         
        3.指令操作的伪代码

        指令操作的伪代码如下面程序段所示。
         
        If  ConditionPassed{cond}  then
             If  opcode[25]==1
                  Operand=8_bit_immediate  Rotate_Right{rotate_imm*2}
             Else /*opcode[25]==0*/
                  Operand=Rm
             If  R==0 then
                  If  field_mask[0]==1 and inAprivilegedMode()  then
                        CPSR[7:0]=operand[7:0]
                  If  field_mask[1]==1 and inAprivilegedMode()  then
                        CPSR[15:8]=operand[15:8]
                  If  field_mask[2]==1 and inAprivilegedMode()  then
                        CPSR[23:16]=operand[23:16]
                  If  field_mask[3]==1 and then
                        CPSR[31:24]=operand[31:24]
             Else/*R==1*/
                  If  field_mask[0]==1 and CurrentModeHasSPSR()  then
                        SPSR[7:0]=operand[7:0]
                  If  field_mask[1]==1 and CurrentModeHasSPSR()  then
                        SPSR[15:8]=operand[15:8]
                  If  field_mask[2]==1 and CurrentModeHasSPSR()  then
                        SPSR[23:16]=operand[23:16]
                  If  field_mask[3]==1 and CurrentModeHasSPSR()  then
                        SPSR[31:24]=operand[31:24]
         
        4.指令的使用

        详见MRS指令。
        5.指令举例

        (1)使用“读-修改-写”模式更新CPSR寄存器。
         
        MRS   r0,CPSR ;读CPSR寄存器的值
        BIC   r0,r0,#0xf0000000 ;清除N、Z、C、V位
        MSR   CPSR_f,r0 ;更新CPSR中的标志位
         
                                                                       
                       
                                                                        注意
                       
                                                                        因为PSR状态寄存器中存在目前没有定义的保留位,所以在使用时,最好加上“_fsxc”后缀,如上例中的“CPSR_f”。这样做的目的是使指令只修改程序状态寄存器的某个域,防止程序向高版本指令集移植时发生意外。
                       
         
        (2)禁止IRQ中断。
         
        MRS    r0,CPSR               ;读CPSR状态寄存器
        ORR    r0,r0,#0x80         ;设置IRQ中断禁止位
        MSR    CPSR_c,r0             ;更新CPSR状态寄存器
         
        (3)堆栈初始化。
         
        INITSTACK
                 MOV    r0,LR          ;保存返回地址
        ;设置管理模式堆栈
                 MSR    CPSR_c,#0xd3;
                 LDR    SP,StackSvc;
        ;设置中断模式堆栈
                 MSR    CPSR_c,#0xd2;
                 LDR    SP,StackIrq;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-14 15:12 , 耗时 0.094340 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表