令状态寄存器访问指令(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寄存器

原文地址:https://www.cnblogs.com/klb561/p/9021874.html

时间: 2024-10-16 13:31:16

令状态寄存器访问指令(MRS,MSR)的相关文章

多寄存器访问、后缀、栈、!、^

为什么需要多寄存器访问指令 ldr/str每周期只能访问4字节内存,如果需要批量读取.写入内存时太慢,解决方案是stm/ldm ldm(load register mutiple) stm(store register mutiple) 举例 stmia sp, {r0 - r12} 将r0存入sp指向的内存处(假设为0x30001000):然后地址+4(即指向0x30001004),将r1存入该地址:然后地址再+4(指向0x30001008),将r2存入该地址······直到r12内容放入(0

ARM常用重要的寄存器及指令解释 和 指令英文全称

一.常用的寄存器 r0 -r3    临时变量  用于传递参数,传递返回指,当传递参数的参数大于4个时,用栈空间.即开辟sp fp:frame pointer  记录回溯sp ip: 很少用 ,临时存放sp sp:指向栈顶 lr:link register 用于跳转时记录返回地址 pc:记录cpu运行指令的地址     因为arm采用流水线方式   取值  译码  执行等   pc=pc+8,     即pc指向当前执行的指令的下两条. cpsr :状态寄存器,每种工作模式有自己的cpsr,记录

ARM 状态寄存器

一.简介 CPSR(当前程序状态寄存器)在任何处理器模式下被访问.它包含了[条件标志位].[中断禁止位].[当前处理器模式标志]以及其他的一些控制和状态位.每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR (备份程序状态寄存器). 当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容.在异常中断退出时,可以用SPSR来恢复CPSR.由于用户模式和系统模式不是异常中断模式(因为这两种模式不会抢占其他模式,所以不需要保存状态寄存器),所以他没有SPSR.当用户在用户模式或系

C8051F340 USB0 寄存器访问

/*************************************************************************** * C8051F340 USB0 寄存器访问 * 说明: * 看一下C8051F340 USB0部分的寄存器访问的原理,毕竟源代码的操作是按照 * 原理来进行编写的. * * 2017-4-1 深圳 南山平山村 曾剑锋 ***************************************************************

跨时钟域的寄存器访问

在verilog中,如果对于一个寄存器可能同时有两个时钟clk对其进行操作,为了防止读写冲突,需要做如下简单处理 clk_f( fast时钟)和clk_s(slow时钟) clk_s对寄存器time_cnt进行写操作, clk_f对寄存器time_cnt进行读操作, 所以当clk_f边沿读取time_cnt的值得时候,time_cnt可能正是clk_s对寄存器写的时候,从而造成clk_f读错误 如下处理 reg time_cnt1,time_cnt2; always @(posedge clk_

Part3_lesson4---协处理器访问指令

1.什么是协处理器? CP15是协处理器, CP15的作用:系统控制协处理器CP15,它提供了额外的寄存器,这些寄存器用于配置和控制cache,MMU,保护系统,时钟模式,和其他的系统项,比如大小端操作. 如何访问CP15协处理器? 可以访问在CP15里定义的寄存器来达到访问CP15,,可以通过命令MCR和MRC指令. CP15定义了16组寄存器, 可以到Arm1176jzfs文件的System control processor registers这个章节里面去查看信息. 两个命令来访问协处理

[国嵌笔记][027][ARM协处理器访问指令]

协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP15是系统控制协处理器,通过额外的寄存器可以控制cache,MMU,系统时钟等功能 访问协处理器 1.CP15有16组寄存器,通过mcr和mrc指令来访问协处理器里的寄存器,从而达到访问协处理器的目的 2.通过datasheet中的CP15 register map summary可以查找到相关的寄存

ARM 汇编 内存访问指令

一. 单个寄存器操作读写内存 内存访问指令格式:<opcode><cond> Rd, [Rn] Rn 中保存的是一个内存的地址值 1. 内存写指令  [ str,strb,strh ]单个寄存器 1) [ str ]写 4 个字节 ldr r0, =0x12345678 @ mov r1, #0x40000000 str r0, [r1] @ 将r0中的数据写入 r1 指向的内存中; str写4个字节 2)[ strb ]写 1 个字节 strh r0, [r1] @ 把 r0 中

改ucosii的中断禁止和恢复代码 【 mrs msr】

ucosii原来的禁止中断以及恢复中断的代码是最简的,但是使用之前,必须声明一个固定名为 OS_CPU_SR   cpu_sr 的变量,吊在那里感觉很怪. ;************************************************* ; Note(s) : These functions are used in general like this: ; void Task (void *p_arg) ; { ; #if OS_CRITICAL_METHOD == 3 /*