访问系统寄存器编码空间的指令,提供以下功能:
- 访问系统寄存器,包括调试寄存器,系统状态和控制相关的寄存器。
- 访问专用寄存器,例如程序状态保存寄存器SPSR、异常链接寄存器ELR,以及CPU状态的某些域。
- 高速缓冲和TLB维护指令,地址翻译指令
- 内存屏障和CLREX(清除对内存的独占标记)指令。
- 体系结构的暗示指令。
系统指令编码占32位长度,基本规则如下:
L表示数据传输方向:
- L=1,表示写系统寄存器
- L=0,表示读系统寄存器
op0表示顶层分类:
- op0=0b00,表示暗示指令、内存屏障指令和内存标记清除指令
- op0=0b01,表示高速缓冲维护指令、TLB维护指令和地址翻译指令
- op0=0b10,表示读写AArch32系统寄存器、调试和跟踪寄存器
- op0=0b11,表示读写非调试系统寄存器,也就是系统状态和控制相关寄存器,以及专用寄存器。
第一类 op0=0b00(我们仅仅介绍第一类,其他类不介绍)
在这一类指令编码中,以CRn来继续分类:
- CRn=0b0010,表示暗示指令,此时op1=0b011,Rt=0b11111,CRm和op2两个域一共7位来进一步标识具体指令。例如:
0b000 0000表示NOP指令;
0b000 0001表示YIELD指令;
0b000 0011表示WFE指令;
0b000 0100表示WFI指令;
0b000 0101表示SEV指令;
0b000 0110表示SEVL指令;
- CRn=0b0011,表示内存屏障和内存标记清除指令,此时op1=0b011,Rt=0b11111,op2三位进一步标识具体指令。例如:
0b001表示DSB指令;
0b010表示CLREX指令;
0b100表示DSB指令;
0b101表示DMB指令;
0b110表示ISB指令。
- CRn=0b0100,表示修改处理器状态PSTATE某个域的指令,其中Rt=0b11111,CRm是用于修改的4位立即数,op2表示具体要修改的域。例如:
0b000表示修改PSTATE.C部分,对应CFINV指令;
0b011表示修改PSTATE.UAO部分,对应MSR UAO,#Imm4指令;