The ARM Processor
缩写 ARM:Advanced RISC Machines RISC:Reduced Instruction Set Computer(精简指令集)
处理器模式及对应的寄存器 ARM支持下面6种处理器模式,在正常情况下,程序都在用户模式下执行,当软件异常或硬件中断发生时,进入相应的处理器模式.
(1):用户(usr):正常程序执行模式 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,CPSR
(2):FIQ(fiq):高速数据传送或通道处理 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8_frq,r9_frq,r10_frq,r11_frq,r12_frq,r13_frq,r14_frq,r15,CPSR
(3):IRQ(irq):通用中断处理 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13_irq,r14_irq,r15,CPSR
(4):管理(svc):操作系统保护模式 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13_svc,r14_svc,r15,CPSR
(5):中止(abt):存储器保护 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13_abt,r14_abt,r15,CPSR
(6):未定义(und):未定义指令 寄存器:r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13_und,r14_und,r15,CPSR
在程序正常执行时,如果发生外部普通中断IRQ,就会进入IRQ处理器模式,这时处理器使用r13_irq和r14_irq,而不是r13和r14.
注释:
R15: 程序计数器. program counter 她指向的是下一条要执行的指令而不是正在执行的指令. R14: 当执行带链接分支的指令BL 时,得到R15 的副本. R13: 作堆栈指针(SP),通常在BOOT 程序里把r13 初始化成指向为异常模式分配的堆栈. 异常处理程序将用到的寄存器的值保存到堆栈里,返回时,重新将这些值加载到寄存器.
举例: 未定义模式堆栈初始化
UNDEFMODE DEFINE 0x1b (00011011) MODEMASK DEFINE 0x1f (00001111) NOINT DEFINE 0xc0 (11000000) mrs r0,cpsr ;把状态寄存器的值送到r0 bic r0,r0,#MODEMASK ;把cpsr 的低四位清零 orr r1,r0,#UNDEFMODE|NOINT ;把r0 的值置为:11011011 然后送给r1 msr cpsr_cxsf,r1 ;把r1 的值送到状态寄存器 ;cpsr 现在的值是: ;cpsr[8:7]=11 相当于禁止IRQ 和FIQ 中断 ;cprs[4:0]=11011 处理器的工作模式:未定义 ldr sp,=UndefStack ;把堆栈的位置送给SP
ARM 寄存器总结: ARM 有16 个 32 位的 registers(r0 到 r15 ). r15 充当程序计数器PC, r14 (link register) 存储子程序的返回地址,r13 是堆栈地址. ARM 有一个当前程序状态register:CPSR. 一些registers(r13,r14)在异常发生时会产生新的instances,比如IRQ 处理器模式,这时处理器使用r13_irq 和r14_irq ARM 的子程序调用是很快的,因为子程序的返回地址不需要存放在堆栈中. |