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。