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