返回大虾电子网首页 返回历史帖子
[+9]ARM的堆栈指令求教.
帖子编号: 92278/1386806, 发表用户:playlinus 发表时间:2008-9-18 16:39:30 访问次数:311 发贴IP:116.30.151.36
文章内容:
在研究2410底层的2410init.s文件时有一段是定义一个异常向量的宏,具体代码如下.
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=$HandleLabel
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
MEND
其中由以上的stmfd和ldmfd指令得知该堆栈为Full descending 满递减堆栈 , 此堆栈栈首地址为高地址 .
而代码中刚开始就是sub sp,sp,#4 ,然后r0入堆栈 ,然后向量地址入r0 ,然后就str r0,[sp,#4],疑问就在这里,这句str r0,
[sp,#4]将定义的向量地址放入了sp+4的地址存储单元以内,而堆栈为递减式的,也就是说向量地址$HandleLabel被此句指令存
入了堆栈以外,最后又出现了一个ldmfd指令pop到pc,这里是不是有问题呢 ?
相关帖子>>>:
● 看来不只我一人有这方面的困惑,现在终于理解了(如内容示) .(2938字)playlinus[14次]2008-9-18 17:44:31
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;bsp=0x20,sp=0x1c 先假设
stmfd sp!,{r0} ;sp=sp-4=0x18,r0->sp[0x18],
ldr r0,=$HandleLabel ;r0=HandleLabel
ldr r0,[r0] ;取地址内容到r0
str r0,[sp,#4] ;r0->sp[0x18]+4(=0x1c)
ldmfd sp!,{r0,pc} ;sp[0x18]->r0,sp=sp+4,sp[0x1c]->pc,sp=sp+4,这样就实现了pc指向
中断处理程序函数入口
评论0
最新资源