当前程序状态寄存器CPSR可以在任何位处理器模式下被访问,它包含条件码标志、中断控制、当前处理器模式以及其他状态和控制信息。CPSR的结构图如下:

一、条件标志位

  CPSR最高4位:N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)称为条件标志位。程序名中的算术或逻辑指令可以根据其执行结果修改这些条件标志位,之后的条件执行指令可以根据这些条件标志决定相应的指令是否被执行。各条件标志位的具体含义如下:
  1、N(符号位)
    该位设置为当前指令运行结果的BIT[31]的值。当两个由补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示结果为正数或零。
  2、Z(零标志位)
    如果指令的运算结果为0,则Z=1(通常用来表示比较的结果为“相等”);否则Z=0.
  3、C(进、借位标志)
    表示运算是否有进位、借位等。下面分4种情况讨论C的设置方法。
    3.1、在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0.
    3.2、B、在减法指令中(包括比较指令CMP),当运算中发生错位(即无符号数运算发生下溢出),则C=0;其他情况下C=1
    3.3、对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位。
    3.4、对于其他非加/减法运算指令,C的值通常不受影响
  4、V(溢出标志位)
    4.1、对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,V=1表示符号位溢出
    4.2、对于非加/减法指令,通常不改变标志位V的值

二、标志位
  在带DSP指令扩展的ARM v5E及更高版本中,CPSR[27]用于指示增强的DSP指令是否发生了溢出或饱和。

三、中断控制位
  I=1时,IRQ(中断模式)被禁止;I=0时,IRQ中断生效
  F=1时,FIQ(快速中断模式)被禁止;F=0时,FIQ中断生效

四、状态控制位
  T位是处理器的状态控制位,主要用于ARM体系带T的版本,在非T系列的ARM版本中,T位将始终为0.当T=0时,处理器处于ARM状态(即正在执行32位的ARM指令),当处理器处于Thumb状态(即正在执行16位的Thumb指令)
  不能通过直接修改CPSR的T位来改变处理器的状态,因为直接修改CPSR的T结果不可预知,必须通过状态切换指令BX、BLX指令来修改T位。

五、模式控制位
  M[4:0]为模式控制位,这些为的组合确定了处理器处于哪种状态。下表给出了各个模式对应的M值:

ARM学习笔记5——程序状态寄存器的更多相关文章

  1. ARM学习笔记6——程序状态寄存器访问指令

    这两条指令结合,可用于对CPSR或SPSR进行读/写操作. 当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传递到通用寄存器中 1.MRS指令(Move to Register ...

  2. arm学习笔记

    学习ARM也有一定时间了,想想还是记点东西,要不以后就忘了.这是我的第一片,简简单单.但比较基础.1. ARM中一些常见英文缩写解释MSB:最高有效位:LSB:最低有效位:AHB:先进的高性能总线:V ...

  3. ARM学习笔记1——Arm寄存器与模式的关系

    ARM微处理器上有37个32位的寄存器,其中有6个状态寄存器(一个CPSR,5个SPSR),其它31个为通用寄存器.在ARM的不同模式下,可以访问的物理寄存器是不同,如下图所示: 从图中可知,用户模式 ...

  4. ARM学习笔记13——LED驱动程序设计

    首先我们要根据开发板原理图得到控制LED灯的引脚是哪个,我们现在以LED1为例,我们已经知道LED1由S5PV210的GPC1_3控制,因此我们按如下步骤进行: 第一步是配制S5PV210的GPC1_ ...

  5. ARM学习笔记11——GNU ARM汇编程序设计

    GNU ARM汇编程序设计中,每行的语法格式如下: [<label>:] [<instruction | directive | pseudo-instruction>] @c ...

  6. ARM学习笔记9——ARM汇编汇编语言中的伪指令

    ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ...

  7. ARM学习笔记8——通用寄存器和存储器内容交换指令和软中断指令

    交换指令将一个存储单元内容与制定的寄存器内容相交换,交换指令为进程间同步提供了一种方便的解决途径.该指令产生一堆原子Load/Store操作,该操作发生在一个连续的总线操作中,在操作期间阻止其他任何指 ...

  8. ARM学习笔记7——乘法指令

    ARM乘法指令完成两个数据的乘法,两个32位二进制数相乘的结果是64位的4积. 其中: 1.“RadHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)链接形成的64位数,“[3 ...

  9. ARM学习笔记2——分支跳转指令

    一.Arm指令条件码和条件助记符 二.跳转指令B 1.作用 跳转指令B使程序跳转到指定的地址执行程序(跳转范围是PC-32MB到PC+32MB) 2.指令格式(注:B后面如果有条件,条件就是紧跟在B后 ...

随机推荐

  1. Android清空画布

    public void clear() { Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR ...

  2. 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds

    问题:服务器负载很高,但是CPU利用率不高.服务器经常夯住,网站打不开,SSH连接非常不稳定,输入命令夯住. 重启服务器报错: INFO: task blocked for more than 120 ...

  3. php安装过程中遇到的需要安装的问题

    http://www.cnblogs.com/kristain/articles/3809243.html     借鉴php安装错误 2013-01-04 19:16:49 分类: 系统运维 环境: ...

  4. CentOS 配置Apache+Mysql+PHP (yum)与卸载

    一.安装Apache2 #yum -y install httpd 安装配置完成,启动httpd服务#service httpd start 二.安装Mysql1.安装mysql#yum -y ins ...

  5. Redis — CentOS6.4安装Redis以及安装PHP客户端phpredis

    一.安装Redis 1.下载安装包 wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.解压包 tar xzf redis-2.8. ...

  6. Omnithreadlibary学习(3)-IOmniTask异步执行SendMessage

    在任务中发送消息, 可以是函数或者对象方法 TOmniTaskMessageEvent = procedure(const task: IOmniTaskControl; const msg: TOm ...

  7. USB Key插入和移除监控

    近期在做USB Key插入和移除监控,已经做到了插入和移除USB Key时,程序能够及时感应到. 如下为源代码: private void Form1_Load(object sender, Even ...

  8. 快速读取csv平面文件,并导入数据库,简单小工具

    using DataToDeal; using LumenWorks.Framework.IO.Csv; using Microsoft.Win32; using System; using Syst ...

  9. 《C和指针》章节后编程练习解答参考——6.3

    <C和指针>——6.3 题目: 编写一个函数,把参数字符串中的字符反向排列. 函数原型: void reverse_string(char *string); 要求: 使用指针而不是数组下 ...

  10. MySQL下Limit使用及性能分析

    对于一直用Oracle的我,今天可是非常诧异,MySQL中同一个函数在不同数量级上的性能居然差距如此之大. 先看表ibmng(id,title,info)  唯一  id key 索引title 先看 ...