关于LPC启动代码startup.s的疑难点,请高手帮助

erlangzhou   2008-7-12 10:18 楼主
以下代码段一直难以理解,请各位帮分析一下:





;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


回复评论 (1)

前一个问题已经解决,知道是将系统模式的CPSR,LR保存到IRQ模式的堆栈中

但这段确实难以理解:

        ADD    LR, PC, #1  ;这里是什么意思? 似乎没有作用
        BX      R3
    CODE16
        BX      PC    ;这里为什么加16位的代码,"BX  PC"又到那里去了? 仅仅是切换模式?但PC的值没有处理啊
        NOP
    CODE32
点赞  2008-7-13 16:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复