文档章节

ARM汇编指令MRS和MSR(转)

For_MGP
 For_MGP
发布于 2014/10/06 18:07
字数 1130
阅读 73
收藏 1
ARM

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代码

if ConditionPassed(cond) then   
    if R == 1 then  
        Rd = SPSR   
    else  
        Rd = CPSR

MSR指令使用的场合:

  • 通常通过“读取-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中。

  • 当异常允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,在用其他指令将SPSR值保存起来。

  • 在进程切换时也需要保存当前状态寄存器的值。

MSR指令介绍

MRS的指令编码格式:

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



 

指令的语法格式:

C代码

MSR{<cond>} CPSR_<fields>, #<immediate>  
MSR{<cond>} CPSR_<fields>, <Rm>  
MSR{<cond>} CPSR_<fields>, #<immediate>  
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代码

mrs r0, cpsr ;读取cpsr中的值  
bic r0, r0, #0x1F ;修改,去除当前处理器模式  
orr r0, r0, #0x13 ;修改,设置特权模式  
msr cpsr_c, r0 ;写回,仅仅修改CPRS中的控制位

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

本文转载自:http://freesoftman.iteye.com/blog/1827249

For_MGP
粉丝 2
博文 66
码字总数 20576
作品 0
深圳
程序员
私信 提问
嵌入式开发笔记(六) ARM汇编指令集基础2

ARM汇编指令集基础2 基本内容回顾: 1. ldr, str, 2. mov r0,r1 mov r0, #0XFF00 mov r0 ,r1,lsl#3 ld r0, [r1] ld r0,[r1,#4] ldmia r0!,{r1-r7,r12} stmfd sp!,{r2-r7,r12} beq flag flag......

每天在改变
2016/12/25
118
0
随笔之GoldFish Kernel启动过程中arm汇编分析

随笔之GoldFish Kernel启动过程中arm汇编分析 一 分析 电子版下载http://download.csdn.net/detail/innost/4834459 本节介绍Kernel启动。此时Piggy已经将vimlinux解压,BL将执行权限传给了K...

邓凡平
2012/12/01
903
7
详细解读ARM寄存器之CPSR

一、CPSR概述 ARM处理器共有37个寄存器。这37个寄存器按其在用户编程中的功能划分,可分为2类寄存器,即31个通用寄存器和6个状态寄存器。这6个状态寄存器在ARM公司文件中其名称分别为:CPSR、...

zjy900507
2018/03/08
0
0
第四篇 从goto 说起

MVC的设计任务显然没有完成,不过为了更好的把后续工作做好,此处不得不插播一些其他内容。以拓宽我们对C的学习。 以下说两句鬼话,绝非属于正常教育学习路线: 1、本篇将介绍ARM的工具,利用...

中山野鬼
2012/10/27
3.5K
11
05-ARM体系结构与常用汇编指令

一、ARM体系结构  ARM(Advanced RISC Machines) ,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。ARM 处理器是一种低功耗高性能的 32 位R...

梦想成大牛
2018/01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0
实战项目-学成在线(八)

在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。 注册中心作用: 1、微服务数量众多,要进行远程调用就需要知...

lianbang_W
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部