zoukankan      html  css  js  c++  java
  • 令状态寄存器访问指令(MRS,MSR)

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。

    针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器。每个位的含义如下图:

    分成了4部分:

    1,条件标志位

    N(Negative), Z(Zero), C(Carry), V(Verflow)统称为条件标志位。ARM指令可以根据CPSR中的这些条件标志位来选择性的执行。

    2,Q标志位

    ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位。主要用于指示增强的DSP指令是否发生了溢出。

    3,控制位

    I, F, T以及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

    下表示控制位M[4:0]的含义:


    M[4:0]

    处理器模式

    可访问的寄存器

    0b10000

    用户模式

    PC,CPSR, R14~R0

    0b10001

    FIQ模式

    PC,CPSR, SPSR_fiq,R14_fiq,R8_fiq, R7~R0

    0b10010

    IRQ模式

    PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0

    0b10011

    管理模式

    PC,CPSR, SPSR_svc,R14_svc,R13_svc,R12~R0

    0b10111

    中止模式

    PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0

    0b11011

    未定义模式

    PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0

    0b11111

    系统模式

    PC,CPSR(ARMv4及以上版本), R14~R0

    4,保留位
     用于将来ARM版本的扩展。

    状态寄存器访问指令仅有两天:

    MRS: 状态寄存器到通用寄存器的传送指令。

    MSR: 通用寄存器到状态寄存器的传送指令。

    MRS指令介绍

    MRS的指令编码格式:



     指令的语法格式:

    MRS{<cond>}<Rd>, CPSR

    MRS{<cond>}<Rd>, SPSR

    其中:

    <cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。

    <Rd>为目标寄存器。

    指令操作的伪代码:

    C代码  收藏代码
    1. if ConditionPassed(cond) then   
    2.     if R == 1 then  
    3.         Rd = SPSR   
    4.     else  
    5.         Rd = CPSR  

    MSR指令使用的场合:

    • 通常通过“读取-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中。
    • 当异常允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,在用其他指令将SPSR值保存起来。
    • 在进程切换时也需要保存当前状态寄存器的值。

    MSR指令介绍

    MRS的指令编码格式:

    这里分为两种格式,一种是原操作数为通用寄存器, 另一种是源操作数是立即数。



     

    指令的语法格式:

    C代码  收藏代码
    1. MSR{<cond>} CPSR_<fields>, #<immediate>  
    2. MSR{<cond>} CPSR_<fields>, <Rm>  
    3. MSR{<cond>} CPSR_<fields>, #<immediate>  
    4. MSR{<cond>} CPSR_<fields>, <Rm>  

     其中:

    <cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。

    <fields>设置状态寄存器中需要操作的位。状态寄存器的32位可以分为4个8位的域:

        f: 指示bits[31 : 24],又名条件标志位域

        s: 指示bits[23 : 16],又名状态标志位域

        x: 指示bits[15 : 8], 又名扩展位域

        c: 指示bits[7 : 0],又名控制位
    <immediate>为将要传送到状态寄存器中的立即数,该立即数的计算方式可以去照看<ARM+Architecture+Reference+Manual.pdf>

    <Rm>寄存器包含将要传送到状态寄存器中的数据。

    指令的操作伪代码:



     

    指令的使用:
    MSR指令通常用于恢复状态寄存器的内容或者改变寄存器的内容。

    当退出异常中断处理器程序时,如果事先保存了状态寄存器的内容通常通过MSR指令将事先保存的状态寄存器内容恢复到状态寄存器中。

    当需要修改状态寄存器的内容时,通过“读取-修改-写回”指令序列完成。写回操作也是通过MSR指令完成的。

    处理器切换到特权模式,使用将要修改某个位域的示例:

    C代码  收藏代码
      1. mrs r0, cpsr ;读取cpsr中的值  
      2. bic r0, r0, #0x1F ;修改,去除当前处理器模式  
      3. orr r0, r0, #0x13 ;修改,设置特权模式  
      4. msr cpsr_c, r0 ;写回,仅仅修改CPRS中的控制位  
      5. 1.MSR和MRS指令介绍
      6.  MRS 指令:  对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。

        MSR指令:    对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。

        2.CPSR 程序状态寄存器(current program status register)

        如图所示,ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,叫做 当前程序状态寄存器 

        CPSR寄存器格式:

        在CPSR寄存器中主要用到了控制位,每个标志位如下图所示:

        3.使用MSR指令写入数据

        例:    

        msr cpsr_c, #0xd2       @0xd2=1100 0010//禁止中断使能,进入中断模式
        
        msr cpsr_c, #0x53        @0x53=0101 0011//开IRQ中断,禁止FIQ中断,进入ARM状态,设为管理(svc32)模式

        其中cpsr_c是因为CPSR有4个8位区域:

        • C 控制域屏蔽字节([7:0])
        • X 扩展域屏蔽字节([15:8])
        • S 状态域屏蔽字节([23:16])
        • F 标志域屏蔽字节([31:24])

        所以cpsr_c表示的是CPSR控制位、

        4.使用MRS和MSR来设置2440位管理模式,实例:

        mrs r0,cpsr         //读状态寄存器cpsr的数据到r0中
        
        bic  r0,r0,#0x1f    //对r0低5位进行清0,清除模式位
        orr    r0,r0,#0xd3  //低8位或(110 10011), 设为管理(svc32)模式,禁止IRQ和FIQ中断
        msr    cpsr,r0      //写入状态寄存器cpsr,更新。

        5.SPSR程序保存状态寄存器(saved program status register)

        SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。

        (注意:用户user模式和系统system模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。)

         在异常模式返回时,如果指令带有S后缀(除了比较指令以外),同时又以PC为目标寄存器进行操作,则操作的同时从SPSR恢复CPSR。以下都是可以恢复CPSR寄存器

  • 相关阅读:
    循环
    if条件语句
    中文字符,全角字符的正则表达式
    常用正则表达式大全!(例如:匹配中文、匹配html)
    PHP中$_SERVER的详细参数与说明
    IIS 伪静态配置(安装ISAPI_Rewrite配置)
    iis php 服务器设置问题
    Apache Rewrite 拟静态配置
    DEDE时间
    DEDE 字符串操作常见问题
  • 原文地址:https://www.cnblogs.com/klb561/p/9021874.html
Copyright © 2011-2022 走看看