ARM寄存器详解
- 格式:pdf
- 大小:94.23 KB
- 文档页数:1
ARM寄存器详解
ARM A系列寄存器的情况
这是寄存器的总表,下⾯是CPU的各个模式,上⾯的纵轴就是寄存器组。
CPU在运⾏的时候为什么会有寄存器?
想象CPU是⼀个圈⼀直在运转,然后寄存器⾥⾯有⼤量的指令,这些指令不知道从哪⾥来的,但是⼀般情况下我们的程序在计算我们的
程序,我们的程序⼀般是放在内存⾥⾯的,它从内存⾥⾯把这些程序读进来之后,在运⾏,但是如果现在这个程序在运⾏时异常,那么就要
进⾏CPU状态的切换,除了状态切换之外,当前的⼀些数据结果需要进⾏⼀个保存,但是如果要把这个结果存到内存去,内存并不稳定并且
很慢,所以就要想办法能不能找到⼀个临时空间保存⼀下,这就是为什么会诞⽣寄存器。
设置寄存器的原因就是为了更好的去控制和达到效率,ARM体系为了很好的去控制CPU,设定了哪些寄存器?
User纵轴上的⼗三个寄存器称为通⽤寄存器,R13是⼀个⽐较特殊的寄存器,也叫做SP,就是占指针的寄存器,就是指向某⼀些占空
间,R14是LR,就是连接寄存器,它肯定是去连接某⼀个地⽅。R15是PC,这是程序计数器,这是CPU在每⼀个空间切换的时候的计数
器,最下⾯那个也就是APSR或者CPSR,PSR就是程序状态寄存器,A代表应⽤程序状态寄存器,C代表当前程序状态寄存器。
在往下就类似于R17,只不过它叫做SPSR,S就是以保存程序代表寄存器或者我们也可以称为存储状态寄存器,通过这些我们⼤概把
寄存器了解了。
那么这上⾯分为通⽤的,那么下⾯就是特殊寄存器,从横向来看,我们可以看到在USR模式下⾯,这样寄存器挺全的,但是USR下⾯
没有SPSR,就是没有存储状态的寄存器,然后FIQ快速中断模式下⾯⾯是共享R0到R7,意思就是这些模式下的R0到R7它们与USR模式下
的R0到R7是共享的,这样如果存储⼀些数据在R0到R9下⾯,突然发⽣异常,切换到另⼀个模式,那么我们就应该要想办法把这个存取⼀
下,因为另⼀个模式可能也要往这⾥⾯写东西,那么写之前就应该把USR模式下的先保留⼀下,到时候退出解决后在还原回来,所以我们要
⼀个R0到R7这块寄存器是共享的,同样FIQ后⾯⼏个模式的R8到R12也是和USR共享的,只有FIQ是⾃⼰独有的,同样的我们在看到PC计
数器也是共享的,还有SPSR也是共享的,但是SPSR每个状态都有⾃⼰独有的。
APSR应⽤程序的⼀个寄存器,它只在USR下⾯叫做APSR,其他模式下⾯叫做当前程序存储寄存器。
总结
1,R0-R12是通⽤寄存器,放通⽤数据然后每个寄存器都是32位的。
2,各个模式的R0到R12与USR模式是共享的(除了FIQ,R8-R12),PC,CPSR是共享的。
3,USR模式没有SPSR
SP:栈指针,存储栈地址,⽐如有个CPU,然后还有个外部资源也就是内存,我们想象CPU在程序跳转的时候在运⾏是最核⼼
的ALU单元,然后外部资源存储着程序A和程序B还有程序C,实际上在CPU在读程序A的时候,可能下⾯的时候会跳到程序B单元,这个时
候它可能不知道地址在哪⾥,那么这个时候就存储在SP这个寄存器⾥⾯,SP这个寄存器表⽰后⾯将要执⾏的程序。
LR:链接寄存器,存储于程序返回地址。这个链接寄存器主要⽤在函数A和函数B,A正在运⾏时,突然要调⽤B,那么就引了⼀个分⽀
了,然后这个函数B去运⾏,运⾏完之后还是要返回到最初然后继续往下⾛,那么这个时候返回值应该要有个记录,这就是链接寄存器。
PC:程序计数器
APSR/CPSR:应⽤程序状态寄存器/当前程序状态寄存器。
SPSR:已存储程序状态寄存器。想象⼀个程序正在运⾏,这个程序当前状态正常,这个状态就先把它保存到CPS⾥⾯,这个时候突然
发⽣异常,那么当前状态就应该变成异常,就把这个状态存到CPSR上⾯,但是异常处理完了之后,我们希望还是能够回到之前那个状态,
但是这个时候当时的状态已经被清理掉了,这个时候我们就可以⽤SPSR把原来那个状态保存,这样当状态在发⽣改变的时候,要还原就可
以去SPSR⾥⾯读取之前那个状态,这就是它们之间的关系,就类似有⼀个A的变量,给A这个变量赋了⼀个值,然后还赋了⼀个新值,但是
⼜希望原来那个值要保存,所以有个变量B,然后把变量A赋给变量B。