屌丝学arm汇编-03-arm模式和cpsr

时间:2023-01-08 01:19:49

1.ARM有7种模式和37个寄存器【引用了一些网上的现有的比较好的图片,向图片作者致敬】

屌丝学arm汇编-03-arm模式和cpsr屌丝学arm汇编-03-arm模式和cpsr


以上图标黑色部分为共用的部分。USR和SYS共用同一个寄存器集。

(1)共同寄存器集合:R0-R7,PC,CPSR

(2)除了USR/SYSTEM其他模式具有自己的 SP,LR和SPSR,用来备份当前模式的堆栈,程序状态,及CPSR。

2.CPSR的解析

        屌丝学arm汇编-03-arm模式和cpsr屌丝学arm汇编-03-arm模式和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位和寄存器分布

M[4:0] 处理器模式 ARM模式可访问的寄存器 THUMB模式可访问的寄存器
0b10000 用户模式 PC,CPSR,R0~R14 PC,CPSR,R0~R7,LR,SP
0b10001 FIQ模式 PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R0~R7 PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0~R7
0b10010 IRQ模式 PC,CPSR,SPSR_irq,R14_irq~R13_irq,R0~R12 PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0~R7
0b10011 管理模式 PC,CPSR,SPSR_svc,R14_svc~R13_svc,R0~R12 PC,CPSR,SPSR_svc,LR_svc,SP_svc,R0~R7
0b10111 中止模式 PC,CPSR,SPSR_abt,R14_abt~R13_abt,R0~R12 PC,CPSR,SPSR_abt,LR_abt,SP_abt,R0~R7
0b11011 未定义模式 PC,CPSR,SPSR_und,R14_und~R13_und,R0~R12 PC,CPSR,SPSR_und,LR_und,SP_und,R0~R7
0b11111 系统模式 PC,CPSR,R0~R14 PC,CPSR,LR,SP,R0~R74

屌丝学arm汇编-03-arm模式和cpsr

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。