在uboot的start.s中有这样一个宏定义:
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0}
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0]
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
分析:
如图所示,假设进前入该宏调用前,sp指向1的位置,则sub sp,sp,#4后,sp指向2.
并且这时2的位置中的内容是空的,当执行stmfd sp!,{r0}后,sp是先加1,即指向3的位置,然后把r0的内容存入,可以知道,位置2的内容此时是空的。执行str r0,[sp,#4]后,sp的位置仍指向3,且把r0的内容存入sp-4,即位置2,这时2中就有了数据。
执行 ldmfd sp!,{r0,pc}后,把3中的内容装入r0,2中的装入pc.此时sp减了两次,又指向了位置1.
阅读(3130) | 评论(0) | 转发(1) |