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