————————————————————-
Author:tiger-john
WebSite:blog.csdn.net/tigerjb
Email:jibo.tiger@gmail.com
Update-Time: 2011年2月14日星期一
Tiger声明:自己轻视直接仿制自己文章而不加出处的个人或集体,
但不排挤他人转载tiger-john的文章,仅仅请您注明出处并和自己
联络或留言给我。3Q
————————————————————-
在ARM处理器内部共有37个用户可拜访的寄存器,别离为
31个通用的32位寄存器和6个状况寄存器。
一.通用寄存器:
1.在汇编语言中,寄存器R0-R13为保存数据或地址值的通用寄存器。
2.其间寄存器R0-R7为未分组的寄存器。
关于任何处理器形式,它们都同享R0~R7的通用寄存器。
3.寄存器R8-R12为两个分组的物理寄存器。
a.FIQ具有自己独立的R8~R12的通用寄存器。
b.其他六种处理器形式同享R8~R12的通用寄存器
注:寄存器R8~R12在ARM体系结构中没有特定的用处。
给FIQ独自的R8~R12可完成快速的中止处理(在产生FIQ中止后,处理器不必为了维护寄存器而浪费时间,然后提高了FIQ的处理速度)
4.寄存器R13和R14
a.用户形式和体系形式共用R13和R14的寄存器内容。
b.其它五个形式具有自己独立的R13和r14寄存器内容。
c.R13作为仓库指针(SP),用于保存待运用的寄存器内容。
d.寄存器R14称为链接寄存器(LR),它的效果有两个:
l当运用BL指令调用子程序时,体系会主动将BL指令的下一条指令的地址存入R14中。
Ø程序A指令过程中调用程序B
Ø程序跳转至标号Lable处,履行程序B.
Ø体系将BL Lable指令的下一条指令地点地址存入R14中
Ø程序B履行最终,履行句子MOV PC,LR将R14寄存器的内容放入PC处,回来至NEXT处持续履行。
l当产生反常时,体系主动将反常的回来地址放入R14中(有些反常有一个小的固定的偏移量)二.重要的寄存器
1.仓库指针R13
R13作为仓库指针SP。在ARM指令会集,由于没有以特别方法运用R13的指令。(在Thumb)指令会集存在运用R13的指令)
每个反常形式都有其本身的R13分组版别,它一般指向由反常形式所专用的仓库。在入口处,反常处理程序一般将其他要运用的寄存器值保存到这个仓库。经过回来时将这些值重装到寄存器中。反常处理程序可保证反常产生时的程序状况不会被损坏。
2.链接寄存器R14
寄存器R14(也称为链接寄存器或LR)在结构上有两个特别功用:
1>在每种形式下,形式本身的R14用于保存子程序回来地址。
a.当运用BL或BLX指令调用子程序时,R14设置为子程序回来地址。
b.子程序回来经过将R14仿制到程序计数器来完成。(p41)
2>当产生反常时,将R14对应的反常形式设置为回来地址。反常回来的履行类似于子程序回来,仅仅运用略微不同的指令来保证被反常中止的程序状况能够彻底康复。
3.程序计数器R15
1>R15里寄存的是正在取值的指令。
而人们一般习气的约定将“正在履行”的指令作为参考点,则:PC=当时程序履行方位+8
2>七种形式共用R15寄存器。
3>由于ARM指令总是以字节为单位,所以R15寄存器的最低两位总是为0。
注:
1.当指令对R15的读取没有超越任何对R15运用的约束时,对R15读取的值是指令的地址加上8字节。
2.用指令读取PC的方法首要用于对邻近的数据进行快速,与方位无关的寻址,包括程序中与方位无关的移动。
3.但是在运用STR或STM指令保存时,会呈现两种状况:
A.这些指令可将指令地址加8字节保存(和其它指令读取R15相同)
B.这些指令或将指令本身地址加12字节。
这与详细的芯片有关。
由于这个原因,运用STR和STM指令是不行移植的。
因而,咱们要防止运用STR和STM指令来保存R15.
4.运用下面的程序能够看到这个详细的偏移量。
5.写R15的一般约束:写如R15值的bit[1:0]有必要为0b00;假如不是,则成果将不行猜测。
6.大多数指令经过指令所指的偏移量与PC值相加并将成果写入PC来核算方针地址:
(当时指令的地址)+8+偏移量。
7.正常接连履行的指令实际上是经过核算:
(当时指令的地址)+4
来核算下一条要履行的指令。
注:差异两个概念:
1.跳转方针的核算方法:
(当时指令的地址)+8+偏移量
2.下一条指令方位的核算方法:
(当时指令的地址)+4
三.当时程序状况寄存器
在ARM内核中包括1个CPSR和5个供反常处理程序运用的SPSR.
先来看图
1.CPSR(当时程序状况寄存器)
1>七中形式同享一个程序状况寄存器。
2>在进入反常形式中,别的一个寄存器程序状况保存寄存器SPSR能够被拜访(体系和用户形式没有SPSR寄存器,其它五中形式都有其自己独立的SPSR寄存器)。在进入反常时,它保存CPSR的当时值;在反常退出时,可经过它康复CPSR.
效果:反映当时处理器的状况,其包括:
a.4个条件标志位(负标志位N,零标志Z,近位标志位C和溢出标志位V)
b.2个中止制止位,别离用于一种类型的中止。
c.5个对当时处理器形式进行编码的位
d.1个用于指示当时处理器状况的标志位(t)
John哥阐明:
牢记在修正寄存器中的值时,要选用读-修该-写的方法。
(首要读出方针寄存器中的数据,再对关怀的比特进行修正,之后将准备好的数据写回到方针寄存器中。)
这样做的优点是:
1.不会改动本来不相关管脚的功用特点。
2.不会影响到寄存器中保存位的数据。
eg:PINSEL0 = (PINSEL0 & (~(3<<10)) |( 2<<10);
这时一种杰出的写法,他完成了对P0.5端脚的修正(即对PINSEL0寄存器中的11:10位比特位进行修正,关于他完成的功用请查阅数据手册,这儿不做解说)
尽量不要选用直接对寄存器写的操作,由于这样可能把寄存器中的所用值都修正了。那么它的结果,我想哥不说你也理解。
2.条件代码标志:
N:当该位为1时:表明负数。为0时:表明正数。
Z:当该位为1时:表明两数持平。为0时:表明两数不持平。
C:当该为1时:若为加法运算(含CMN)表明产生进位,不然C=0;
当该位为1时:若为减法运算(含CMP)表明不借位,不然C=0(即产生借位)
注:关于移位运算C为最终的移出值,其他指令C一般不变。
V:当该位为1时:运用加法/减法运算时,表明有符号溢出。;不然V=0;
注:
在ARM中,所用指令都可按条件来履行。
在Thumb中,只要分支指令可条件履行。
3.操控位:
CPSR的最低8位为操控位。别离是中止制止位,T位,模位。
1>当产生反常时,操控位改动。当处理器在一个特权形式下操作时,可用软件操作这些位。
a.中止标志位:
当I位为1时,IRQ中止被制止
当F位为1时,FIQ中止被制止.
b.T位:
该位反映了处理器状况:
当T位为1时,处理器处于Thumb状况下运转。
当T位为0时,处理器处于ARM状况下运转。
John哥阐明:
肯定不要强制改动CPRS寄存器中的T位,不然处理器会进入一个无法猜测的状况,那么你也就杯具了。
2>形式为
M4,M3,M2,M1和M0位都是形式位。这些位决议处理器的操作形式(不是所用形式位的组合都界说有有用的处理器形式,因而留意不要运用表中未列出的组合。
看个图:
Tiger阐明:
1.牢记不行把不合法的值写入形式位,不然处理器将进入一个无法康复的形式。假如你这样做了,tiger祝贺你杯具了。那么你现在要做的便是按下开发板的复位键,严峻的就只能拔掉电源。重新启动了
2.在对CPRS寄存器进行操作时,不能操作保存位。
3.每个反常形式还带有一个程序状况保存寄存器(SPSR),它用于保存使命在反常产生之前的CPSR.
四.Thumb状况下的寄存器
1.Thumb状况寄存器是ARM状况集的子集,它有
l8个通用寄存器(R0~R7)
l程序核算器(PC)
l仓库指针(SP)
l链接寄存器(LR)
l当时程序状况寄存器(CPSR)
1>七个形式共用8个通用寄存器(R0~R8)。
2>SP(仓库指针寄存器),对应ARM状况下的寄存器R13,每个反常形式都有其自己独立的SP,SP指向各反常形式所专用的仓库。
<在产生反常时,处理器会主动进入ARM状况。>
3>链接寄存器(LR)对应ARM状况寄存器R14.
产生反常时,处理器主动进入ARM状况。
4>当时程序状况寄存器(CPSR)对应ARM状况寄存器R14。.
2.Thumb状况寄存器和ARM状况寄存器之间的映射。
1>Thumb状况中的R0~R7与ARM状况R0~R7相同。
2>Thumb状况中的SP映射到ARM状况下的R13中
3>Thumb状况中的LR映射到ARM状况R14中。
4>Thumb状况中的PC映射到ARM状况R15(PC)寄存器中。
5>Thumb状况CPSR(在Thumb状况中无SPSR)与ARM状况CPSR相同。
注:在Thumb中,高端寄存器的拜访是受到约束的,只要MOV,CMP和ADD指令能够对其拜访,能够用于数据的快速暂存。