现在的位置: 首页 > 综合 > 正文

IRQ.s的理解

2013年03月25日 ⁄ 综合 ⁄ 共 684字 ⁄ 字号 评论关闭

开始看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。这样就很明白了吧!嘻嘻!

抱歉!评论已关闭.