打印
[ZLG-ARM]

请教高手一个关于lpc2200系列的一个启动代码中的堆栈的问题

[复制链接]
1794|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wchangtao|  楼主 | 2007-11-5 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问高手:在startup.s中有一段:
__user_initial_stackheap    
    LDR   r0,=bottom_of_heap
;    LDR   r1,=StackUsr
    LDR   r2,=top_of_heap
    LDR   r3,=bottom_of_Stacks
........
StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
.......
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4
.......
end
这段代码有两个问题考虑了好长时间也没有找到答案,恳请各位高手指点。
1。第三行为什么被注释掉了?按照编译器的使用手册r1应该返回栈底的地址的呀?
2。SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4中为什么SVC_STACK_LEGTH 要减 1?不减一的话不行吗?
多谢!多谢!

相关帖子

沙发
wchangtao|  楼主 | 2007-11-6 11:09 | 只看该作者

自己回答以下吧

1,第三行之所以注释掉了,是因为这样一条指令在c语言环境的初始化过程中刚好在调用__user_initial_stackheap之前已经有一句指令将栈底的地址赋给r1了,所以第三行是重复操作,可以去掉。昨天晚上看反汇编代码时发现的。
2,这个问题仍然感觉不应该减一。 

使用特权

评论回复
板凳
zlgarm| | 2007-11-6 11:59 | 只看该作者

re~~~~

减一是为了获取栈底地址,例如,定义10个字的数组int temp[10],如果你想对第十个元素写数据,那你写的位置就是temp[9];堆栈中SVC_STACK_LEGTH相当于数组大小,栈底相当于数组的高后一个元素

使用特权

评论回复
地板
wchangtao|  楼主 | 2007-11-6 15:00 | 只看该作者

re:zlgarm

多谢指点,不过我感觉不能拿数组类比。
因为SvcStackSpace应该是用SPACE声明的空间的第一个字节的地址而不是第一个字的地址,再加上ads1.2支持的是满递减堆栈,所以不用减一。
不知理解的对不对。请指正,多谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

21

帖子

0

粉丝