1.什么是异常源?
引发处理器进入对应的异常模式
2.异常源和异常模式的对应关系

1.五种异常模式,七种异常源 ;
2.根据不同的异常源,引发处理器进入不同的异常模式,执行异常处理函数
3.异常源具有优先级,复位的优先级最高
3.异常处理流程

保存现场:

恢复现场:

4.为什么引入异常向量表

5.swi软中断指令

例子:
.text
.global _start
_start:
@1.构建异常向量表
b reset
b undef_interrupt
b software_interrupt
b prefetch_dataabort
b data_abort
b .
b irq
b fiq
reset:
@2.系统一上电,程序运行在SVC模式
@1> 初始化SVC模式下,栈指针
ldr sp,=0x40000800
@3.从SVC模式切换到user模式
msr cpsr,#0xD0
@4.user模式下代码
@1> 初始化user模式下,栈指针
ldr sp,=0x40000700
mov r0,#0x1
mov r1,#0x2
@4.执行软中断指令 ===> 保存现场(四大步三小步)
swi 2
add r0,r0,r1 @ r0 = 0x3
b stop
undef_interrupt:
software_interrupt:
@压栈保存现场
stmfd sp!,{r0-r12,lr}
mov r0,#0x3
mov r1,#0x4
add r0,r0,r1 @ r0 = 0x7
@出栈恢复现场
ldmfd sp!,{r0-r12,pc}^
@^:将SPSR_<MODE>寄存器中的值,给到CPSR寄存器中
prefetch_dataabort:
data_abort:
irq:
fiq:
stop:
b stop
.end