注:本人系初学者,有错误请不吝指出。
1.ARM指令中有37个寄存器,有31个通用寄存器和6个状态寄存器。
------coretex-A多出3个寄存器,monitor模式 r13_mon,r14_mon,spsr_mon;
原因:系统模式和用户模式共享相同的寄存器。用户、系统模式没有“保存的程序状态寄存器(SPSR)”,而其他5种模式分别有一个对应的“保存的状态寄存器(SPSR)”,即共五个SPSR,七个模式共用一个“当时程序状态寄存器(CPSR)”,即共六个状态寄存器,还有31个通用寄存器。
注意:任何模式都可以存取:
r0--r12,r13(栈指针寄存器sp),r14(链接寄存器lr),r15(程序计数器pc),CPSR
2.CPSR程序状态寄存器剖析:
这个寄存器的作用主要就是记录上一条指令执行的状态,根据结果来执行后面的事情;
1.高4位:NZCV
N 置1:结果是负数;
Z 置1:结果是0;
C 置1:结果完成或借位
V 置1:结果溢出
2.27位--Q位:仅ARM v5TE-J支持,表示饱和状态
3.25-26位:空
4.24位-J位:仅ARM v5TE-J支持,
T = 0; J = 1时,处理器处于Jazelle状态;
5.20-23位:DNM位,do not modify,不能动就对了;
6.16-19位:GE【3:0】位,大于或等于(执行SIMD指令时有效);
7.10-15位:IT【7:2】,if……then……指令执行状态位;
8.9位-E位,大小端控制位;
9.8位-A位,A= 1:禁止不精确的数据异常;
10.6-7位,I = 1:禁止IRQ; F = 1:禁止 FIQ;
11.5位-T位:T = 0, J = 0:处理器处于ARM状态;
T = 1, J = 0:处理器处于ARM状态;
T = 1, J = 1:处理器处于ARM状态;
12.末5位-模式位:表示8中不同的模式,如10000 - USER模式 等等;
3.SPSR保存的状态寄存器详解:
作用:当异常产生时,内核执行的第一步:
拷贝CPSR到SPSR_;
----为了保存异常之前的状态,当异常结束时,要切回到这里;处理器应付不同的异常时要使用不同的工作模式,各种异常模式都有对应的SPSR寄存器;
---->(所以SPSR寄存器就是这个用);
4.lr链接寄存器详解:
作用:当异常产生时,内核执行的第三步:
保存返回地址到LR_;
---就是把pc指针(指向被预取的指令)保存到lr-->(所以链接寄存器就是这个用);
5.sp栈指针寄存器
作用:就是保存pc的值的,中断前一般要压栈保护pc指针,就是所谓的压栈保护;
6.r15----PC--程序计数寄存器
1.ARM状态时,指令要按字节32bits对齐,所以末两位未定义(为0);
因为4的二进制就是0100,只要指令末尾2位是0,这个指令肯定是4的倍数;
2.Thumb状态时,指令要按半字节16bits对齐,所以末尾位未定义(0);
3.Jazelle状态时,指令要按8bits对齐,要执行一个字节的话,要取4条指令;
7.说明:1)、用户模式外,其它6种模式称为特权模式。所谓特权模式,即具有如下权利:a.MRS(把状态寄存器的内容放到通用寄存器);b.MSR(把通用寄存器的内容放到状态寄存器中)。由于状态寄存器中的内容不能够改变,因此要先把内容复制到通用寄存器中,然后修改通用寄存器中的内容,再把通用寄存器中的内容复制给状态寄存器中即可完成“修改状态寄存器”的任务。
2)、剩下的六种模式中除去系统模式外,统称为异常模式。