ARM微处理器支持7种运行模式,分别为:
1. 用户模式(usr):ARM处理器正常的程序执行状态;
2. 快速中断模式(fiq):用于高速数据传输或通道管理;
3. 外部中断模式(irq):用于通用的中断处理;
4. 管理模式(svc):操作系统使用的保护模式;
5. 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护;
6. 系统模式(sys):运行具有特权的操作系统任务;
7. 未定义指令中止模式(und):当未定义指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
ARM体系结构的存储器格式有如下两种:
大端格式:字数据的高字节存储在低地址中,字数据的低字节存放在高地址中;
小端格式:与大端存储格式相反,高地址存放数据的高字节,低地址存放数据的低字节
ARM寄存器总结:
ARM有16个32位的寄存器(r0到r15)。
r15充当程序寄存器PC,r14(link register)存储子程序的返回地址,r13存储的是堆栈地址。
ARM有一个当前程序状态寄存器:CPSR。
一些寄存器(r13,r14)在异常发生时会产生新的instances,比如IRQ处理器模式,这时处理器使用r13_irq和r14_irq
ARM的子程序调用是很快的,因为子程序的返回地址不需要存放在堆栈中。
i. 31个通用寄存器,包括程序计数器(PC)在内。都是32位寄存器
ii. 6个状态寄存器,都是32位寄存器,但目前只使用了其中12位
2、 ARM处理器有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器,有些是各模式自己拥有的独立的物理寄存器。
3、 通用寄存器可以分为3类:未备份寄存器(R0~R7)、备份寄存器(R8~R14)和程序计数器PC(R15)。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。对应备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器,这使得中断处理非常简单。例如,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而使中断处理过程非常迅速。对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的,另外的5个对应于其他5种处理器模式。
4、 每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。
5、 寄存器R14又被称为连接寄存器(Link Register,LR),在ARM体系中具有下面两种特殊的作用:
i. 每一种处理器模式自己的物理R14中存放当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。
ii. 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与子程序返回方式基本相同。
6、 由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字节对齐的,PC值得第0位和第1位总为0。
7、 对于ARM版本3以及更低的版本,写入R15的地址值的bits[1:0]被忽略,对于ARM版本4以及更高的版本,程序必须保证写入R15寄存器的地址值的bits[1:0]为0b00;否则会产生不可预知的结果。对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0]。
还有一些指令对于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。
8、 指令mov pc, pc将程序跳转到当前指令下面第2条指令处执行。类似的指令还有add pc, pc, #0
9、 每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
10、 由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中 访问SPSR,将会产生不可预知的结果。
-----------------------------------------------------------------------------------------------------
ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。
用户模式
|
系统模式
|
特权模式
|
中止模式
|
未定义指令模式
|
外部中断模式
|
快速中断模式
|
R0
|
R0
|
R0
|
R0
|
R0
|
R0
|
R0
|
R1
|
R1
|
R1
|
R1
|
R1
|
R1
|
R1
|
R2
|
R2
|
R2
|
R2
|
R2
|
R2
|
R2
|
R3
|
R3
|
R3
|
R3
|
R3
|
R3
|
R3
|
R4
|
R4
|
R4
|
R4
|
R4
|
R4
|
R4
|
R5
|
R5
|
R5
|
R5
|
R5
|
R5
|
R5
|
R6
|
R6
|
R6
|
R6
|
R6
|
R6
|
R6
|
R8
|
R8
|
R8
|
R8
|
R8
|
R8
|
R8_fiq
|
R9
|
R9
|
R9
|
R9
|
R9
|
R9
|
R9_fiq
|
R10
|
R10
|
R10
|
R10
|
R10
|
R10
|
R10_fiq
|
R11
|
R11
|
R11
|
R11
|
R11
|
R11
|
R11_fiq
|
R12
|
R12
|
R12
|
R12
|
R12
|
R12
|
R12_fiq
|
R13
|
R13
|
R13_svc
|
R13_abt
|
R13_und
|
R13_inq
|
R13_fiq
|
R14
|
R14
|
R14_svc
|
R14_abt
|
R14_und
|
R14_inq
|
R14_fiq
|
PC
|
PC
|
PC
|
PC
|
PC
|
PC
|
PC
|
CPSR
|
CPSR
|
CPSR
SPSR_svc
|
CPSR
SPSR_abt
|
CPSR
SPSR_und
|
CPSR
SPSR_inq
|
CPSR
SPSR_fiq
|
当成功的向R15写入一个数值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的值应满足bits[1:0]为0b00,具体要求arm各版本有所不同:
**对于arm3以及更低的版本,写入R15的地址值bits[1:0]被忽略,即写入r15的地址值将与0xFFFF FFFC做与操作。
**对于ARM4以及更高的版本,程序必须保证写入R15的地址值bits[1:0]为0b00,否则将产生不可预知的后果。
对于Thumb指令集来说,指令是半字对齐的,处理器将忽略bit[0]。
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。
31
|
30
|
29
|
28
|
27
|
26
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
N
|
Z
|
C
|
V
|
Q
|
DNM(RAZ)
|
I
|
F
|
T
|
M4
|
M3
|
M2
|
M1
|
M0
|