一、ARM处理器主要分为A系列处理器以及M系列处理器,不同的处理器工作模式也不相同,现在就A系类以及M系列的工作模式来做一下总结。
1、关于cortex-A系列工作模式
2.关于cortex-M系列工作模式
总结:对于不同的处理器,都是在特定的模式下执行特定的代码,完成特定的功能。
二、ARM的寄存器组织(ARM-v7)
1、在了解寄存器的组织之前,先来了解一下ARM处理器的大致框图
icache:高速指令缓存
dcache:高速数据缓存
控制器:负责控制程序的运行
运算器:处理数据运算以及将运行的结果写回寄存器中
寄存器:存储数据(注:空间有限,只有100多字节,而且不能取地址操作(后面介绍为什么不能取地址))
对于他们读写数据的快慢来说,内核中的寄存器是速度最快的,其次就是缓存,然后就是内存,最后是硬盘
2、ARM-v7寄存器组织
1、寄存器是没有地址的,只能通过编号进行访问,对于ARM-v7架构来说,每个寄存器都是32位的(一条汇编指令首先被编译生成32位的机器码,这个机器码中需要包含指令中的信息,如果在加上地址信息就存不上了(采用压缩可以吗?答案:不可以,如果采用压缩的方式,岂不是更加麻烦了))。
2、banked(灰底)是属于对应模式私有的寄存器,其他的都属于公有的寄存器,如果对应的模式下,有私有的寄存器,那么它就不能访问公有的寄存器(比如说在FIQ模式下,不能访问公有r8寄存器,只能访问自己私有的r8_fiq寄存器),浅色字体代表只能访问到用户模式下的寄存器(比如说在IRQ模式下只能访问用户模式下的r0寄存器)
3、用户模式和系统模式公用一套寄存器组织
4、特殊寄存器介绍:
sp寄存器(r13寄存器):栈指针寄存器--->用来压栈保存现场的
lr寄存器(r14寄存器):链接寄存器--->用来保存返回地址的
pc寄存器(r15寄存器):程序计数寄存器--->存放当前指令的地址(完成取指操作,pc的值 会自动加4指向下一条指令)
cpsr寄存器:当前程序状态寄存器--->保存当前程序的运行状态
(1)N[31]位 ----> 指令的运算结果为负数,N位被自动置1, 否则清0.
(2)Z[30]位 ----> 指令的运算结果为零,Z位被自动置1,否则清0.
(3)C[29]位 ---->加法:进行加法运算时,如果产生进位,C位被自动置1,否则清0.
进位:低32位向高32位进位(溢出的标志位)。
减法: 进行减法运算时,如果产生借位,C位被自动清0,否则置1.
借位:低32位向高32位借位。
(4)V[28]位 ----> 如果符号位发生变化,V位被自动置1,否则清0.
(5)I[7]位 ----> IRQ的屏蔽位;I = 1表示屏蔽IRQ类型的中断;I = 0表示不屏蔽IRQ类型的中断
(6)F[6]位 ----> FIQ的屏蔽位;F = 1表示屏蔽FIQ类型的中断;F = 0表示不屏蔽FIQ类型的中断
(7)T[5]位 ----> 状态位;T = 0: ARM状态,执行的是ARM指令集,ARM指令的宽度是4个字节。
T = 1:Thumb状态,执行的是Thumb指令集,Thumb指令的宽度是2个字节。
(8)M[4:0]位 ---> 模式位
10000 User mode;
10001 FIQ mode;
10011 SVC mode;
10111 Abort mode;
11011 Undfined mode;
11111 System mode;
10110 Monitor mode;
10010 IRQ mode;
注:其他的值保留。
spsr寄存器:保存程序状态寄存器--->主要对cpsr寄存器进行备份
三、ARM的寄存器组织(ARM-v8)