1.ARM有7种模式和37个寄存器【引用了一些网上的现有的比较好的图片,向图片作者致敬】
以上图标黑色部分为共用的部分。USR和SYS共用同一个寄存器集。
(1)共同寄存器集合:R0-R7,PC,CPSR
(2)除了USR/SYSTEM其他模式具有自己的 SP,LR和SPSR,用来备份当前模式的堆栈,程序状态,及CPSR。
2.CPSR的解析
CPSR由上可以分为4个域:F,S,X,C,其中F,C域最重要。
条件位:
N = Negative result from ALU
Z = Zero result from ALU
C = ALU operation Carried out
V = ALU operation oVerflowed
Q 位:
仅ARM 5TE/J架构支持仅ARM xT架构支持
T Bit
指示饱和状态 T = 0: 处理器处于 ARM 状态,T = 1: 处理器处于 Thumb 状态
J 位
仅ARM 5TE/J架构支持 处理器模式位
J = 1: 处理器处于Jazelle状态
中断禁止位:
I = 1: 禁止 IRQ.
F = 1: 禁止 FIQ.
Mode位:指示ARM的模式
3.Thumb和ARM状态下各个模式的Mode位和寄存器分布
|
4.示例代码来控制arm的mode。
stacklen equ 64 area mode,code,readonly entry start ;01 Get current arm mode -arm or thumb; mov r0,#0 mrs r0,cpsr tst r0,#0x20 bne thumb_state mov r0,#1 mov r2,#2 cmp r0,r2 bl disable_irq bl disable_fiq mov r0,pc b switch_fiq mov r0,pc b switch_irq mov r0,pc b switch_svc mov r0,pc b switch_abt mov r0,pc b switch_udf mov r0,pc b switch_sys mov r0,pc b switch_user b stop switch_user mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xd0 msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_fiq mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xd1 msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_irq mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xd2 msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_svc mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xd3 msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_abt mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xd7 msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_udf mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xdb msr cpsr_c,r3 mov lr,r0 mov pc,lr switch_sys mrs r3,cpsr bic r3,r3,#0xff orr r3,r3,#0xdf msr cpsr_c,r3 mov lr,r0 mov pc,lr disable_fiq mrs r3,cpsr orr r3,r3,#080 msr cpsr_c,r3 mov pc,lr disable_irq mrs r3,cpsr orr r3,r3,#0x40 msr cpsr_c,r3 mov pc,lr thumb_state nop stop b stop area mode,data,readwrite usrstack space stacklen*4 sysstack space stacklen*4 fiqstack space stacklen*4 irqstack space stacklen*4 svcstack space stacklen*4 abtstack space stacklen*4 udfstack space stacklen*4 end因为这里不涉及到各个模式运行的状态保存的问题,所以切换比较粗陋,没有涉及到lr,sp和spsr。