ARM中MRS汇编指令

news/2024/7/7 16:26:58

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中的控制位  

 

 

当进程切换到应用场合,应指定SPSR_fsxc来完全恢复。

 


http://www.niftyadmin.cn/n/1372877.html

相关文章

有点舍不得拿出来和大家共享的东西:管理定律23类ZT

source : http://www.blogcn.com/saveas.asp?id3266341 一、 素养   蓝斯登原则&#xff1a;在你往上爬的时候&#xff0c;一定要保持梯子的整洁&#xff0c;否则你下来时可能会滑倒。    提出者&#xff1a;美国管理学家蓝斯登。    点评&#xff1a;进退有度&#…

arm汇编—bic ,orr

1. bicBIC指令的格式为&#xff1a;BIC{条件}{S} 目的寄存器&#xff0c;操作数1&#xff0c;操作数2BIC指令用于清除操作数1的某些位&#xff0c;并把结果放置到目的寄存器中。操作数1应是一个寄存器&#xff0c;操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作…

耶鲁大学博士:计划经济办不出一流大学

? --------------------------------------------------------------------------------?http://www.sina.com.cn 2004年08月14日12:25 南方都市报 ?  最近中外大学校长论坛&#xff0c;又把“建设世界一流大学”的运动给炒热。在这一大跃进中获益最多的清华 大学&#…

关于红黑树

1 理解左旋和右旋 旋转是相对于所选定的两个节点及其兄弟节点构成的三角形而言的&#xff0c;左旋转就是这两个节点构成的边向左旋转到了另外一条边&#xff0c;而右旋转就是这两个节点够的边向右旋转到了另外一条边上。旋转成功了之后&#xff0c;当了父亲的儿子多出来的一条边…

ARM汇编指令(B/BL/BX)

跳转指令用于实现程序流程的跳转&#xff0c;在 ARM 程序中有两种方法可以实现程序流程的跳转&#xff1a; (1) 使用专门的跳转指令。 (2) 直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写入跳转地址值&#xff0c;可以实现在 4GB 的地址空间中的任意跳转&a…

对清华有限元板块的看法兼谈怎样学习有限元

发信人: wuhee (无涯的荒野), 信区: FEA标 题: 对清华有限元板块的看法兼谈怎样学习有限元发信站: BBS 水木清华站 (Fri Aug 13 17:08:43 2004), 站内 准确的说&#xff0c;应该是谈谈我对发在这里的帖子质量的看法。因为专业的原因&#xff0c;我对有限元及其软件是有很深感情…

第一阶段检查结果

《软件工程》团队第一阶段Sprint检查表 评委组号&#xff1a;__________14___________评委学号&#xff1a;______20173671________评委签字&#xff1a;_______袁鹏___________ 团队组号&#xff1a;__________13___________团队名称&#xff1a; 404-Not-Found团队 …

数学中的武林故事

发信人: wizard (再见不再见), 信区: Reader标 题: [合集] 数学中的武林故事 (zz) (转载)(转寄)发信站: BBS 水木清华站 (Fri Aug 13 19:13:48 2004), 站内 ☆─────────────────────────────────────☆ NullPointer (象Giant Toy) 于…