CPSR

  • N:当两个表示的有符号整数运算时,1表示运算结果为负数,0表示结果为正或零。
  • Z:1表示运算的结果为零,0表示运算的结果不为零。对于CMP指令,1表示进行比较的两个数大小相等。
  • C:下面分四种情况讨论C的设置方法:
            a) 加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。        
            b) 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。        
            c) 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。        
            d) 对于其他的非加/减运算指令,C的值通常不改变。
  • V:下面分两种情况讨论V的设置方法
            a) 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
            b) 对于其他的非加/减运算指令,C的值通常不改变。
  • I: 1 表示禁止外部(硬件)中断(IRQ)
  • F:1 表示禁止快速中断(FIQ)
  • T:1 表示为 thumb 状态。 0 为 ARM 状态。
  • M[4:0]:用来设置处理器的工作模式具体数据见本文开始的介绍

SPSR ( 5 个 备份状态寄存器 )

SPSR(备份的程序状态寄存器,或者叫 影子寄存器

SPSR 除 usr、sys 外,对应用于异常保护的 CPSR 的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器

 

ARM 所有工作模式下都可以访问程序状态寄存器 CPSR。CPSR 包含 条件标志位、中断控制位、当前处理器模式 以及其他状态和控制信息。CPSR 在每种异常模式下都有一个对应的物理寄存器 ---- 程序状态保存寄存器 SPSR。当异常发生的时候,SPSR用于保存 CPSR 的值,以便异常返回后恢复异常发生时的工作状态

 

ARM 指令包含4位的条件码列表:

操作码条件码助记符标志含义
0000EQZ=1相等
0001NE(Not Equal)Z=0不相等
0010CS/HS(Carry Set/High or Same)C=1无符号数大于或等于
0011CC/LO(Carry Clear/LOwer)C=0无符号数小于
0100MI(MInus)N=1负数
0101PL(PLus)N=0正数或零
0110VS(oVerflow set)V=1溢出
0111VC(oVerflow clear)V=0没有溢出
1000HI(HIgh)C=1,Z=0无符号数大于
1001LS(Lower or Same)C=0,Z=1无符号数小于或等于
1010GE(Greater or Equal)N=V有符号数大于或等于
1011LT(Less Than)N!=V有符号数小于
1100GT(Greater Than)Z=0,N=V有符号数大于
1101LE(Less or Equal)Z=1,N!=V有符号数小于或等于
1110AL任何无条件执行(默认)
1111NV任何从不执行

ARM指令所有指令都是带有条件的,默认是AL即无条件执行,当指令带有默认条件时不需要明确写出。

下面将会结合上图和上面列出的框架对寄存器进行解析:

未分组寄存器:R0 - R7  R15  cpsr,cpu 在任何模式下看到的 这几个寄存器都是一样的。在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。

分组寄存器 R8 - R14 在不同模式下看到的这几个寄存器是不一样的

分组寄存器R8~R12
 

寄存器功能说明

  • R0 - R12   存取数据,临时数据
  • R13:sp 用于指向不同模式的栈顶。栈,每种模式都需要开辟一块内存,用于在该模式下 函数调用,临时分配的数据存放在此处。Stack Pointer (SP),栈指针寄存器,该寄存器始终保存着一个指向栈顶的值,值得注意的地方;
    SP寄存器的Bit[1:0](最低两位)始终为0,因此这个寄存器是按照字对齐的,也就是四个字节;

    M3有两个堆栈指针,并且同一时刻只能使用其中的一个;
    主堆栈指针(MSP/SP_main):复位后默认使用的堆栈指针寄存器,用于操作系统内核以及异常处理例程(包括中断服务例程);
    进程堆栈指针(PSP/SP_process):由用户的应用程序代码使用。
    寄存器R13通常被用作堆栈指针寄存器,另外究竟使用哪个寄存器,由CPU的控制寄存器来决定;

    Handler mode :即系统发生异常(中断等)的情况会进入该模式,通常使用SP_main;
    Thread mode:用户程序正常运行时处于该模式,可以选择使用SP_main 或 SP_process;
    CPU的Configuration Control Register,如下图所示;

  • M3有两个堆栈指针,并且同一时刻只能使用其中的一个;
    • 主堆栈指针MSP/SP_main):复位后默认使用的堆栈指针寄存器,用于操作系统内核以及异常处理例程(包括中断服务例程);
    • 进程堆栈指针PSP/SP_process):由用户的应用程序代码使用。
  • R14 : lr 程序跳转的时候,返回到的地址就保存到此处
  • R15 :pc 要执行的下一条指令地址,就存放在此处,每次指令执行完,就自动+4
  • CPSR:程序状态寄存器。程序执行的时候,有很多临时标记位,结果是0 是否溢出,是否有借位,是否有 进位,当前cpu模式,
  • SPSR:用于模式切换,将切换前的 cpsr 保存到 新的模式的 spsr,模式切换回去的时候,再将spsr的内容还原到cpsr。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值