开始看IRQ.s,有个问题没明白,自己静下心来到网上找资料慢慢理解方才彻悟!把网上的资料整理写写自己的
心得,哈哈!网络万岁!
先列出程序详单
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label
IMPORT $IRQ_Exception_Function
$IRQ_Label
SUB LR, LR, #4
STMFD SP!, {R0-R3, R12, LR}
MRS R3,SPSR
STMFD SP,{R3,LR}^
NOP
SUB SP,SP,#4*2
MSR CPSR_C,#(NoInt|SYS32Mode)
BL $IRQ_Exception_Function
MSR CPSR_c,#(NoInt|IRQ32Mode)
LDMFD SP,{R3,LR}^
MSR SPSR_cxsf,R3
ADD SP,SP,#4*2
LDMFD SP!,{R0-R3,R12,PC}
MEND
开始会对STMFD SP!, {R0-R3, R12, LR} 和 STMFD SP,{R3,LR}^感到疑惑,为什么STMFD SP!, {R0-R3,
R12, LR}已经把LR压栈了怎么后面又保存一次呢?其实有这个疑惑的一般是对"^"理解不是很深。好,现在来说
说"^"这个吧。使用"^"后缀进行数据传送且寄存器列表不包含PC时,加载/存储的是用户模式的寄存器,而不是
当前模式的寄存器。显然这里两次保存的LR是不一样的,第一个是当前模式下的lr,而后面的则是保存用户模式
的lr。这样就很明白了吧!嘻嘻!