加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 9.2  状态寄存器访问指令
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

2013/09/13
阅读需 13 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

 

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;

Arm

Arm

ARM公司是一家知识产权(IP)供应商,主要为国际上其他的电子公司提供高性能RISC处理器、外设和系统芯片技术授权。目前,ARM公司的处理器内核已经成为便携通讯、手持计算设备、多媒体数字消费品等方案的RISC标准。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知识产权(IP)供应商,主要为国际上其他的电子公司提供高性能RISC处理器、外设和系统芯片技术授权。目前,ARM公司的处理器内核已经成为便携通讯、手持计算设备、多媒体数字消费品等方案的RISC标准。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相关推荐

电子产业图谱

华清远见(www.farsight.com.cn)是国内领先嵌入师培训机构,2004年注册于中国北京海淀高科技园区,除北京总部外,上海、深圳、成都、南京、武汉、西安、广州均有直营分公司。华清远见除提供嵌入式相关的长期就业培训、短期高端培训、师资培训及企业员工内训等业务外,其下属研发中心还负责嵌入式、Android及物联网方向的教学实验平台的研发及培训教材的出版,截止目前为止已公开出版70余本嵌入式/移动开发/物联网相关图书。企业理念:专业始于专注 卓识源于远见。企业价值观:做良心教育、做专业教育,更要做受人尊敬的职业教育。