|
ENTRY(vector_IRQ)
@
@ save mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, [r13] @ save lr_IRQ
mrs lr, spsr
str lr, [r13, #4] @ save spsr_IRQ
@
@ now branch to the relevent MODE handling routine
@
mrs r13, spsr @ switch to SVC_32 mode
bic r13, r13, #MODE_MASK @ preserve F and T bits
orr r13, r13, #MODE_SVC|I_BIT
msr spsr_c, r13 @ switch to SVC_32 mode
and lr, lr, #15
ldr lr, [pc, lr, lsl #2]
movs pc, lr @ Changes mode and branches
.LCtab_irq: .word __irq_usr @ 0 (USR_26 / USR_32)
.word __irq_invalid @ 1 (FIQ_26 / FIQ_32)
.word __irq_invalid @ 2 (IRQ_26 / IRQ_32)
代码如上 主要不理解的地方是 msr spsr_c,r13 add lr,lr,#15地方 在网上大家都认为这里的lr=spsr也就是跳转到中断之前哪个模式下的cpu状态寄存器,但是我觉得在msr spsr_c,r13后cpu进入的是svc_32模式这时候的lr应该是svc_lr而不是上面的irq_lr了呀,而且movs中的s标志位也只是修改ALU标志位对mode标志位无影响的...希望高手们给点启示....小弟先谢上 |
|