令状态寄存器访问指令(mrs,msr)(代码片段)

konglingbin konglingbin     2022-11-11     194

关键词:

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寄存器

嵌入式:交换指令之swp,mrs,msr

存储器与寄存器交换指令(SWP)交换指令把字或无符号字节的读取和存储组合在了一条指令中。这种组合指令通常用于不能被外部其他存储器访问(如:DMA访问)打断的存储器操作。一般用于处理器之间或处理器与DMA控制器之间... 查看详情

)嵌入式linux之常用汇编指令(代码片段)

1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情

设置svc模式

清0:bic置1:orr访问cpsr和spdr要用到mrs和msr指令mrs是把状态寄存器的值赋给通用寄存器msr是把通用寄存器的值赋给状态寄存器 1.text2.global_start3_start:4breset5ldrpc,_undefined_instruction6ldrpc,_software_interrupt7ldrpc,_prefetch_abort8ldrpc,_d 查看详情

arm指令

...●协处理器指令:CDP、LDC、STC、MCR、MRCARM指令寻址方式:寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、基址变址寻址、相对寻址、多寄存器寻址、堆栈寻址堆栈寻址与多寄存器寻址对照:参考:https://blog.csdn.net/yu... 查看详情

)嵌入式linux之常用汇编指令(代码片段)

1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情

)嵌入式linux之常用汇编指令(代码片段)

1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情

windowsssdt(代码片段)

...xx方式相比速度更快,因为sysenter指令大量的使用了MSR寄存器存储跳转地址等。MSR寄存器相关读/写命令//读取msr寄存器rdmsrxxxx//写入msr寄存器wrmsrxxxx其中xxx是msr寄存器的编号比如174h等为方便记忆我们约定了一些编号的名字IA32_S... 查看详情

windowsssdt(代码片段)

...xx方式相比速度更快,因为sysenter指令大量的使用了MSR寄存器存储跳转地址等。MSR寄存器相关读/写命令//读取msr寄存器rdmsrxxxx//写入msr寄存器wrmsrxxxx其中xxx是msr寄存器的编号比如174h等为方便记忆我们约定了一些编号的名字IA32_S... 查看详情

arm指令(代码片段)

文章目录寄存器ARM指令MOVMVNSUBADDANDORRBICCMPTST条件BLADRLLSLRORMRSMSR寄存器装载和存储伪指令数据伪指令操作类伪指令协处理器访问指令协处理器访问寄存器ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器应用程序工作在... 查看详情

arm指令(代码片段)

文章目录寄存器ARM指令MOVMVNSUBADDANDORRBICCMPTST条件BLLSLRORMRSMSR寄存器装载和存储伪指令数据伪指令操作类伪指令协处理器访问指令协处理器访问寄存器ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器应用程序工作在user... 查看详情

arm汇编内存访问指令(代码片段)

  一。单个寄存器操作读写内存内存访问指令格式:<opcode><cond>Rd,[Rn]  Rn中保存的是一个内存的地址值1.内存写指令 【str,strb,strh】单个寄存器  1)【str】写4个字节ldrr0,=0x12345678@movr1,#0x40000000strr0,[r1]@将r0... 查看详情

arm汇编语言基础(代码片段)

ARM与Thumb寄存器对应关系PC寄存器:ARM状态为R15,Thumb状态为PCLR寄存器:ARM状态为R14,Thumb状态为LRSP寄存器:ARM状态为R13,Thumb状态为SPIP寄存器:ARM状态为R12,Thumb状态为IPFP寄存器:ARM状态为R11,Thumb状态为FP其他对应关系一一相同ARM与Thumb指令... 查看详情

MSR CPSR_C,#0x13 不能使用 ARM 程序集?

...无操作系统)。我需要读取一个只能在主管模式下访问的寄存器(多处理器关联寄存器,MPIDR)。当我处于用户模式并尝试使用调试器逐步执行以下指令(进入超级用户模式)时,没有任 查看详情

arm指令和thumb指令有啥区别

...件的转移。  数据处理指令  数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。数据处理操作比ARM状态的更少,访问寄存器R8~R15受到一定限制。... 查看详情

向量指令和标量指令(代码片段)

...由指令确定向量操作数的地址(主存储器起始地址或向量寄存器号),并直接或隐含地指定如增量、向量长度等其他向量参数。向量指令规定处理机按同一操作处理向量中的所有分量,可有效地提高计算机的运算速度。不具备向... 查看详情

arm汇编指令

...r0,存入r02.比较指令cmp指令:cmpr0,r1@根据r0-r1值判断状态寄存器(cpsr寄存器)tst指令:tstr0,#0b1001@按位与的值判断状态寄存器(cpsr寄存器)3.跳转指令b指令:blabel@直接跳转bgtlabel1@大于跳转beq@等于跳转bl指令:blfunc@调用函数跳转... 查看详情

软考计算机系统笔记(代码片段)

...技术数字证书加密算法可靠性公式cpu用户可见:通用寄存器组、程序状态字寄存器(PSWR)、程序计数器(PC)、累加寄存器(ACC)用户不可见:指令寄存器(IR)、暂存寄存器(DR)、存储... 查看详情

20165232第四周学习总结(代码片段)

...的某些部分,这称为程序员可见状态。Y86-64状态包括15个寄存器、程序计数器PC(存放当前正在执行指令的地址)、、3个一位的条件码(ZF、SF和OF)、内存和状态码。Y86-64指令4个传送指令irmovqrrmovqmrmovqrmmovq其中指令的第一个字母... 查看详情