Chinaunix首页 | 论坛 | 博客
  • 博客访问: 387703
  • 博文数量: 61
  • 博客积分: 4650
  • 博客等级: 上校
  • 技术积分: 786
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 21:07
个人简介

少抱怨,多实干;

文章分类

全部博文(61)

文章存档

2017年(1)

2016年(13)

2015年(1)

2013年(2)

2011年(1)

2010年(3)

2009年(23)

2008年(17)

我的朋友

分类: LINUX

2009-06-15 16:32:05

 
在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) |
给主人留下些什么吧!~~