以下代码段一直难以理解,请各位帮分析一下:
;IRQ中断服务程序
IRQ_Handler
SUB LR, LR, #4
STMFD SP!, {R0-R3, R12, LR}
MRS R3, SPSR
STMFD SP, {R3, LR}^ ;此处保护用户模式的CPSR,LR不知有什么作用,为什么不能回写SP,此SP道底是那个模式下的SP?
LDR R2, IRQ_HandlerData
SUB SP, SP, #4*2
MSR CPSR_c, #(NoInt | SYS32Mode)
LDR R3, [R2]
ADD LR, PC, #1 ;这里是什么意思?
BX R3
CODE16
BX PC ;这里为什么加16位的代码,"BX PC"又到那里去了?
NOP
CODE32
MSR CPSR_c, #(NoInt | IRQ32Mode)
LDMFD SP, {R3, LR}^ ;??????????????????????????
MSR SPSR_cxsf, R3
ADD SP, SP, #4*2
LDMFD SP!, {R0-R3, R12, PC}^
IRQ_HandlerData
DCD VICVectAddr
前一个问题已经解决,知道是将系统模式的CPSR,LR保存到IRQ模式的堆栈中
但这段确实难以理解:
ADD LR, PC, #1 ;这里是什么意思? 似乎没有作用
BX R3
CODE16
BX PC ;这里为什么加16位的代码,"BX PC"又到那里去了? 仅仅是切换模式?但PC的值没有处理啊
NOP
CODE32