• cpsr当前程序状态寄存器


    详解CPSR寄存器(ls_core)

      (2012-10-11 17:29:47)

    在介绍CPSR寄存器之前,让我们来想个问题。CPU执行一条指令的流程是这样的,CPU从存储器高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。在这个过程中,CPU执行了加、减、移位运算。想想看每次加、减、移位运算后的结果的信息哪里去了?有两种可能,A:随着运算的结束消失了。B:将运算的相关信息存储了起来。举个例子:8位二进制无符号数相加,1111_1110B+0000_0011B=0000_0001(假设微处理器是8位的,该加法结果溢出了)。该加法表达式译为汇编语言为:

    MOV     R0  #0xFE                 @将立即数0xFE装入通用寄存器R0中

    ADD     R0  R0  #03               @将R0中的内容和立即数0x03相加后存入R0中

    显然,在运算完成后通用寄存器中的值为0x01,那么给人的感觉就是254+3=1(有点“小学没毕业”的感觉)。对!CPU就是“小学没毕业” 该运算结果CPU认为是正确的,只不过CPU将运算信息(该运算信息就是在运算过程中出现了一次运算溢出)存储了起来。其实CPU认为R0中的值和中间运算信息的集合才是该表达式的预算结果。好!我们的答案出来了,选B。CPU将运算的相关信息存储了起来。问题又来了,这个运算信息要存到哪里?答案便是笔者今天要将得内容:程序状态寄存器CPSR。

    ARM920T微处理器任何一种模式下都有一个程序状态寄存器CPSR(current program status register)的寄存器。该寄存器就是用来存储一些关于运算的信息,包括,条件标志位、中断禁止位、当前处理器模式标志和控制状态位等。CPSR是一个32位寄存器,大体分为三段:[31:28]、[27:8]和[7:0],如图所示:

    详解CPSR寄存器(ls_core)

    一、条件标志位[31:28]

    条件标志位有N(Negative)、Z(Zero)、C(Carry)和V(Overflow)。这些标志位统称为条件标志位。

    1、符号标志位N

    当两个补码表示的有符号整数运算时,若结果为负则N=1;若结果为正或为零则N=0;例如代码(假设CPU是8位的):

    MOV     R0        #0x05

    SUB      R1,     R0,     #0x06

    当CPU执行完该代码之后R1中的值为0XFF。同时CPSR中的符号标志位N=1,表示运算结果R1中的值为-1。再看下面一段代码:

    MOV     R0,        #0x06

    SUB     R1,        R0,        0x05

    当CPU执行完该代码后R1中的值为0x01,同时CPSR中的符号标志位N=0,表示运算结果R1中的值为1。

    2、零标志位Z

    Z=1表示运算结果为零;Z=0表示运算结果不为零。

    注:对于CMP命令中,Z=1表示比较的两个数大小相等。

    MOV     R0         #05

    CMP     R0         #05

    当CPU执行CMP这条代码时,将R0中的值(0x05)与立即数0x05相减(结果不保存),同时使CPSR中的符号标志位Z=1,表示比较的两个数大小相等。

    3、进位、借位标志C

    该标志位分四种情况表示:

    A、在加法指令(包括比较指令CMN)中,C=1,表示无符号运算结果产生了进位。其他情况C=0。例如:

    MOV     R0  #0xFE                

    ADD     R0  R0  #03              

    当CPU执行完该代码后,R0中的值为0x01,同时CPSR的标志位

    C=1,表示运算结果向上进位,该运算结果的大小为257(这便解释了,开头说所的CPU “小学没毕业” 的问题)。

    B、 在减法指令(包括比较指令CMP)中,当运算中发生借位C=0,表示无符号数运算发生下溢出;其他情况,C=1;

    C、 在对于移位操作的指令,C的值为最后一次被移出位的值。例如:

    MOV     R1,     #0xA5

    MOV     R0,     R1, LSR#2 @将R1中的值向右移动两位后存入R0

    CPU执行完该代码后,R0中的值为0x29,同时CSPR中标志位C的值为最后一出去的‘0’。

    D、对于其他非加、减运算指令一般不会影响C的值。

    4、溢出标志位V

    当带符号数进行加减运算指令出现符号位溢出时V=1。

    二、[27:8]没有开发利用。

    三、控制位[7:0]

    当异常中断发生时,该控制位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

    ●  中断禁止位:

    1.        当I=1时,禁止IRQ中断。

    2.        当F=1时,禁止FIQ中断。

    在CPU上电复位时需要将IRQ和FIQ中断关闭,可以通过一下代码实现。

    MRS       R0,    CPSR           @将CPSR中的内容读入R0中

    BIC       R0,    R0,   #0xC0   @清零R0的第7、6位

    ORR       R0,     R0,    #0xC0   @置位R0的第7、6位

    MSR       CPSR,   R0             @将R0中的内容回送到CPSR中

    ●  T控制位

    T控制位用于说明执行的指令时ARM指令还是Thumb指令。对于ARM920T来说,T=0表示ARM指令;T=1表示Thumb指令。

    ●  控制位M[4:0]控制处理器的模式,共7种模式,如表所示:

    详解CPSR寄存器(ls_core)

    注:ARM920T共有7种工作模式,除去用户模式和系统模式剩下的5中模式中,处理器有一个专用的备份程序状态寄存器SPSR(Backups Program statues register)。当特定的异常中断发生时,SPSR用于存放CPSR中的内容,在异常中断处理完成后,可以用SPSR中的内容来恢复CPSR。已达到保护并恢复中断现场作用。SPSR的格式与CPSR的格式完全相同。

  • 相关阅读:
    HTML JS 数据校验
    算法: 实现LRU缓存,读取、写入O(1)实现
    C/C++ 二维数组
    tmux 终端分屏利器使用
    关于Apache Tomcat存在文件包含漏洞的安全公告
    SQLSERVER触发器触发INSERT,UPDATE,DELETE三种状态
    SQL Server 触发器
    SQL Server游标
    SQL Server基础之游标
    阿里maven镜像配置
  • 原文地址:https://www.cnblogs.com/liudehao/p/6067284.html
Copyright © 2020-2023  润新知