ARM_异常处理流程_编写软中断swi验证保存现场和恢复现场

keil

.text
.global _start
_start:
	@1.构建异常向量表
	b reset
	b undef
	b software_interrupt
	b prefetch_abort
	b data_abort
	b .
	b irq
	b fiq
reset:
	@系统上电之后处于svc模式
	@初始化svc模式下的栈指针
	ldr sp,=0x40000800
	@2.从SVC模式切换到user模式 msr cpsr,#0xD0
	mrs r0,cpsr
	orr r0,r0,#((0x1 << 4))
	and r0,r0,#(~(0xf))
	msr cpsr,r0
	@3.执行user模式下代码,初始化user模式下栈指针
	ldr sp,=0x40000700
	mov r0,#0x1
	mov r1,#0x2
	swi 2   @CPU自动保存现场,会执行四大步三小步过程
	add r0,r0,r1 @ r0 = r0 + r1 = 0x3
	b stop	
undef:
software_interrupt:
prefetch_abort:
data_abort:
irq:
fiq:
software_interrupt:
	@压栈保存现场	
	stmfd sp!,{r0-r12,lr}
	mov r0,#0x3
	mov r1,#0x4
	add r0,r0,r1 @ r0 = r0 + r1 = 0x7
	@出栈恢复现场
	ldmfd sp!,{r0-r12,pc}^
	@^将spcr_<MODE>寄存器中的值回复到cpsr寄存器中

stop:
	b stop
.end
	

猜你喜欢

转载自blog.csdn.net/lsw2604190117/article/details/131575371