ARM的处理器一般能够履行ARM的指令集(32bit或许64bit)和Thumb指令集(16bit)。履行不同的指令集时会进行状况跳转,可是状况的跳转不会影响处理器的作业方式和相应存储器的内容。
ARM->Thumb:操作数寄存器状况为1,履行BX指令。
Thumb->ARM:操作数寄存器状况为0,履行BX指令。或许是处理器进行反常处理(IRQ,FIQ,Reset,Undef,Abort,SWI ARM状况履行)时,把pc指针放入反常方式链接寄存器中,并从反常向量地址开端履行程序,也能够使得处理器切换到ARM状况。
以上是全体指令集体系的状况,接下来说一下ARM处理器的运转方式。用过Linux的都知道,操作体系有许多运转方式,其实着许多的运转方式也是需求处理器支撑的。ARM处理器的运转方式有七种:(除用户方式,其他均归于非用户方式或许特权方式;除了用户方式和体系方式,其他都称为反常方式)
用户方式(USR):正常状况;
快速中止方式(FIQ):用于高速数据传输或通道方式;
外部中止方式(IRQ):用于通用的中止处理;
管理方式(SVC):操作体系运用的维护方式;
数据拜访停止方式(ABT):当数据或指令预取停止时进入该方式,可用于虚拟存储维护及存储维护;
体系方式(SYS):运转具有特权的操作体系使命;(Linux下便是root用户了)
未定义指令中止方式(UNDEF):当未定义的指令时进入该方式,可支撑硬件协处理器的软件仿真。
那么咱们为了完结以上的方式,咱们在处理器这儿资源应该怎么分配呢?这儿就涉及到寄存器组了。寄存器组就能够存储这些方式,并在该方式下操作所需求的数据。
以下便是ARM指令集的寄存器组:
咱们能够看到针对一些特定的方式寄存器组会有所改动。一共有37个32bit的寄存器。带三角形的便是分组寄存器,专用寄存器。快速中止的7个便于快速中止。R0~R7是未分组寄存器,通用。
当其他除了快速中止方式之外,其他方式由于要拜访R8~R12,就有可能在方式转化的时分要维护现场。
一般来说,R13便是仓库寄存器,当然指定其他寄存器也是能够的。
R14其实便是子程序链接地址,比方递归的时分,它里边存的便是回来地址。比方汇编的
MOV PC,LR
BX LR
以上便是完结了回来链接地址。别的R14还能够处理中止或许反常回来。
R15便是程序计数器(PC)。ARM的[31:2]来保存地址,由所以4个字节。Thumb指令集便是[31:1]是地址,[0]=0。由于只要两个字节,指令之间的地址便是相差2。由所以多级流水线规划,所以保存PC的时分要注意PC会因流水线而改动。
当然上面说了许多方式还有什么状况康复,回来之前状况,仓库处理啊其实和真实你在写处理器的时分不必管,由于许多功用是经过调度完结的,不必太介意更高笼统层次的东西。在这儿说一下仅仅添加一些在处理器硬件低层完结之后假如完结那些杂乱程序有更多的了解。
CPSR:也便是程序状况寄存器。这种寄存器便是存储整个程序履行的一个状况。包含了4 bit的条件代码标志(N,Z,C,V);2bit中止制止位(别离用于一种类型的中止);5bit去对当时处理器操作方式进行编码的位;1bit用于指示当时履行的是Thumb仍是ARM指令集。
如图:
中止制止位:I,F
I = 1,制止IRQ机制;F = 1,制止FIQ机制。
T表明标志位,该位反响了处理器的运转状况。
假如方式不确定,那么就会导致进行复位。
看一下Thumb指令集体系:
thumb指令集体系的方式位的意义: