总结:ARM的学习中,寄存器贯穿一直,基本上每一本教材材料的开篇都会先介绍作业形式和寄存器常识,这部分内容十分重要,可是往往不能引起初学者的留意,ARM处理器形式就不细说了,这个都知道,关于寄存器,归纳来讲,便是咱们说的R0-R16这个不是仅有的,而是每个寄存器称号或许对应多个物理寄存器,详细对应几个,下面有介绍,其间要特别留意R14-R16,因为这三个寄存器有详细的意义,而且不同ARM作业形式下,对应的寄存器其实是不同的,举个比如,在体系形式下,对仓库指针SP(R14_svc)设置,和在间断形式(IRQ)下对仓库指针SP(R14_irq)这两个指针姓名相同,可是意义彻底不同,知道了这一点,在看发动代码,进出间断汇编代码的时分,信任就不会产生一些“不可思议”了。
ARM处理器形式
用户形式(User):ARM处理器正常的程序履行状况
快速间断形式(FIQ):用于高速数据传输或通道处理
外部间断形式(IRQ):用于通用的间断处理
管理形式(Supervisor):操作体系运用的维护形式
数据拜访停止形式(Abort):当数据或指令预取停止时进入该形式,可用于虚拟存储及存储维护
体系形式(System):运转具有特权的操作体系使命
未定义指令间断形式(Undifined):当未定义的指令履行时进入该形式,可用于支撑硬件协处理器的软件仿真
ARM寄存器
ARM共有37个32位寄存器,其间31个为通用寄存器,6个为状况寄存器.这些寄存器不能被一起拜访,但在任何时分,通用寄存器R0~R14,程序计数器PC,一个或两个状况寄存器都是可拜访的.
通用寄存器
通用寄存器包含R0~R15,能够分为3类:
(1)未分组寄存器R0~R7
(2)分组寄存器R8~R14
(3)程序计数器PC(R15)
1.未分组寄存器R0~R7
在所有运转形式下,未分组寄存器都指向同一个物理寄存器,它们未被体系用作特别的用处.因此在间断或反常处理进行运转形式转化时,因为不同的处理器运转形式均运用相同的物理寄存器,所以或许形成寄存器中数据的损坏.
2.分组寄存器R8~R14
关于分组寄存器,它们每一次所拜访的物理寄存器都与当时处理器的运转形式有关.关于R8~R12来说,每个寄存器对应2个不同的物理寄存器,当运用FIQ(快速间断形式)时,拜访寄存器R8_fiq~R12_fiq;当运用除FIQ形式以外的其他形式时,拜访寄存器R8_usr~R12_usr.
关于R13,R14来说,每个寄存器对应6个不同的物理寄存器,其间一个是用户形式与体系形式共用,别的5个物理寄存器对应其他5种不同的运转形式,并选用以下记号来区别不同的物理寄存器:
R13_
R14_
其间mode可为:usr,fiq,irq,svc,abt,und.
寄存器R13在ARM指令中常用作仓库指针,用户也可运用其他的寄存器作为仓库指针,而在Thumb指令会集,某些指令强制性的要求运用R13作为仓库指针.
寄存器R13在ARM指令中常用作仓库指针,但这仅仅一种习惯用法,用户也可运用其他的寄存器作为仓库指针。而在Thumb指令会集,某些指令强制性的要求运用R13作为仓库指针。
因为处理器的每种运转形式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种形式下的R13,使其指向该运转形式的栈空间。这
样,当程序的运转进入反常形式时,能够将需求维护的寄存器放入R13所指向的仓库,而当程序从反常形式回来时,则从对应的仓库中康复,选用这种方法能够确保反常产生后程序的正常履行。
R14称为链接寄存器(Link Register),当履行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份.
在每一种运转形式下,都可用R14保存子程序的回来地址,当用BL或BLX指令调用子程序时,将PC的当时值仿制给R14,履行完子程序后,又将R14的值仿制回PC,即可完结子程序的调用回来。以上的描绘可用指令完结。
履行以下恣意一条指令:
MOV PC, LR
BX LR
在子程序入口处运用以下指令将R14存入仓库:
STMFD SP!,{,LR}
对应的,运用以下指令能够完结子程序回来:
LDMFD SP!,{,PC}
R14也可作为通用寄存器。
留意:运用BL 指令时,ARM会主动的将PC值寄存到R14(LR)中,这一点不必程序员自己寄存,假如BL 是跳转到C程序中,进栈出栈操作也不必程序员考虑,而假如是跳转到汇编程序中,则需求程序员完结进出栈的作业。
3,程序计数器PC(R15)
寄存器R15用作程序计数器(PC),在ARM状况下,位[1:0]为0,位[31:2]用于保存PC,在Thumb状况下,位[0]为0,位[31:1]用于保存PC.
因为ARM体系结构选用了多级流水线技能,关于ARM指令集而言,PC总是指向当时指令的下两条指令的地址,即PC的值为当时指令的地址值加8个字节
程序状况寄存器
4,寄存器R16
寄存器R16用作CPSR(Current
Program Status Register,当时程序状况寄存器),CPSR可在任何运转形式下被拜访,它包含条件标志位、间断制止位、当时处理器形式标志位,以及其他一些相关的操控和状况位。
每一种运转形式下又都有一个专用的物理状况寄存器,称为SPSR(Saved Program Status Register,备份的程序状况寄存器),当反常产生时,SPSR用于保存CPSR的当时值,从反常退出时则可由SPSR来康复CPSR。
因为用户形式和体系形式不属于反常形式,它们没有SPSR,当在这两种形式下拜访SPSR,成果是不知道的
1).条件码标志(condition code flags)
N,Z,C,V均为条件码标志位,它们的内容可被算术或逻辑运算的成果所改动,而且能够决议某条指令是否被履行.
在ARM状况下,绝大多数的指令都是有条件履行的,在Thumb状况下,仅有分支指令是有条件履行的.
N(Number):当用两个补码表明的带符号数进行运转时,N=1表明运转成果为负,N=0表明运转成果为正或零
Z:(Zero):Z=1表明运算成果为零,Z=0表明运转成果非零
C:(Come)加法运算:当运算成果产生了进位时C=1,不然C=0
减法运算:当运算产生了借位,C=0不然C=1
关于包含移位操作的非加/减运算指令 ,C为移出值的最终一位
关于其他的非加/减运算指令C的值一般不改动
V:(oVerflow)关于加/减法运算指令,当操作数和运算成果为二进制的被码表明的带符留意力时,V=1表明符号位溢出.关于其他的非加/减运算指令V的值一般不改动
2).操控位
PSR的低8位(包含I,F,T和M[4:0])称为操控位,当产生反常时这些位能够被改动,假如处理器运转特权形式,这些位也能够由程序修改.
(1)间断制止位I,F
I=1 制止IRQ间断
F=1 制止FIQ间断
每一种运转形式下又都有一个专用的物理状况寄存器称为SPSR(Saved Program Status Register,备份的程序状况寄存器)当反常产生时,SPSR能够保存CPSR的当时值,从反常退出时则可由SPSR来康复CPSR.
因为用户形式和体系形式不属于反常形式,它们没有SPSR当在这两种形式下拜访SPSR时成果是不知道的
Thumb状况下程序能够直接拜访8个通用寄存器(R0~R7),程序计数器(PC),仓库指针(SP:StackPointer),链接寄存器(LP:Link Register)和CPSR,一起在每一种特权形式下都有一组SP,LR和SPSR.
ARM指令导址方法
1.当即寻址(当即数寻址)
ADD R0,R0,#1 //R0<-R0+1
ADD R0,R0,#0x31 //R0<-R0+0x3f
当即数以”#”为前缀,关于以十六进制表明的当即数,还要求在”#”后加上”0x”前缀
2.寄存器寻址
ADD R0,R1,R2 //R0<-R1+R2
3.寄存器直接寻址
ADD R0,R1,[R2] //R0<-R1+[R2]
LDR R0,[R1]
STR R0,[R1] //[R1]<-R0
4.基址变址寻址
LDR R0,[R1,#4] //R0<-[R1+4]
LDR R0,[R1,#4]! //R0<-[R1+4],R1<-R1+4
LDR R0,[R1,R2] //R0<-[R1+R2]
5.多寄存器寻址
LDMIA R0,[R1,R2,R3,R4] //R1<-[R0],R2<-[R0+4],R3<-[R0+8],R4<-[R0+12]
6.相对寻址
BL NEXT //跳转到子程序NEXT处履行
……
NEXT
….
MOV PC,LR //从子程序回来