STM32启动代码不解

[复制链接]
2845|8
 楼主| 菜鸟同学 发表于 2012-8-16 18:12 | 显示全部楼层 |阅读模式
Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

为什么__initial_sp 在后面被称为是标号,而且是0x20000000(RAM 在STM32 中的映射地址)+Stack_Size
为什么一下就变成这样的数据了,不解。为什么不是这样
__initial_sp
Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size  

就是想问一句__initial_sp 为啥就变成0x20000000+Stack_Size
 楼主| 菜鸟同学 发表于 2012-8-17 09:06 | 显示全部楼层
求香主解疑!:lol
IJK 发表于 2012-8-17 11:35 | 显示全部楼层
LZ应该查看具体的汇编器 的文档。

另外,汇编语言一般情况下,__initial_sp 这种写法都被称为是标号。
 楼主| 菜鸟同学 发表于 2012-8-17 18:12 | 显示全部楼层
3# IJK

我就是一直在学习ARM汇编,ARM汇编的基础不够。
aozima 发表于 2012-8-17 18:36 | 显示全部楼层
__initial_sp写在SPACE的后面,所以__initial_sp所在的地址就是SPACE+size
blowlow 发表于 2012-8-17 18:42 | 显示全部楼层
__initial_sp这个值就是SPACE+size,没问题的。

它要赋给sp register的,ARM Cortex的堆栈是倒着长的,从高位地址向低位地址增长,因此sp register的初始值必须是堆栈的末端地址。
airwill 发表于 2012-8-17 22:33 | 显示全部楼层
楼上分析得完全正确.
因为 __initial_sp 要 Stack_Mem  + Stack_Size
而编译器总是从小地址往下排的, 所以就要

Stack_Size      EQU     0x00000500
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp   (放到后面来)
 楼主| 菜鸟同学 发表于 2012-8-20 17:53 | 显示全部楼层
6# blowlow
谢谢的你的回答,我想明白了,一时头脑发热短路,想不清楚。
john_lee 发表于 2012-8-20 20:08 | 显示全部楼层
仔细想想,其实把栈指针(sp)直接定位到 RAM 末尾就行了,哪还需要在启动代码中定义stack?MDK 有够衰的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

706

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部