找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5793|回复: 2
打印 上一主题 下一主题
收起左侧

STM32F429的启动文件 startup_stm32f429xx.s中的疑问?

[复制链接]
跳转到指定楼层
楼主
ID:157141 发表于 2017-2-8 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
下面的代码是从STM32F429的启动文件 startup_stm32f429xx.s中摘抄的关于栈区定义的汇编代码:
Stack_Size      EQU    0x400;       ……………………………………………………第1行

                       AREA    STACK, NOINIT, READWRITE, ALIGN=3 ………..第2行
Stack_Mem     SPACE   Stack_Size …………………………………………………..第3行
__initial_sp  …………………………………………………………………………………….第4行


(1)这4行语句中有3个伪指令“EQUAREA SPACE”,共4行代码,只有第1行的代码后面有一个分号“;”,其他3行都没有,这是怎么回事?

(2)第1行代码定义了一个变量Stack_Size且 Stack_Size==0x400,这我可以理解,没啥问题。

(3)第2行代码,是伪指令AREA,定义了一个数据段段名为STACK的内存空间,不初始化或不初始化为0,可读可写,并以8字节对齐。这个8字节对齐是什么概念?为什么要8字节对齐?

(4)第3行代码中,SPACE   Stack_Size是开辟一个大小为0x400的内存空间,那么"Stack_Mem"是标号吗?是表示开辟的这个内存空间的名称是Stack_Mem么?本来我也认为Stack_Mem是一个定义的内存空间的名称,可是在“.MAP”文件中,Stack_Mem的值却是个地址(如下灰色区域所示),可以看出Stack_Mem==0x20000388,它不是内存空间么,怎么会是0x20000388?而不是0x400=1024KB,为什么?
Symbol Name                              Value        Ov Type     Size     Object(Section)
  .data                                   0x2000001c   Section        4       usart.o(.data)
  .bss                                     0x20000020   Section      264     usart.o(.bss)
  .bss                                     0x20000128   Section       96      libspace.o(.bss)
  HEAP                                   0x20000188   Section      512     startup_stm32f429xx.o(HEAP)
  Heap_Mem                          0x20000188   Data         512      startup_stm32f429xx.o(HEAP)
  STACK                                 0x20000388   Section     1024    startup_stm32f429xx.o(STACK)
  Stack_Mem                          0x20000388   Data        1024     startup_stm32f429xx.o(STACK)
  __initial_sp                           0x20000788   Data           0        startup_stm32f429xx.o(STACK)

(5)第4行代码中,“_initial_sp”表示栈顶指针,_initial_sp是怎么来的?那我随便写个字符都可以表示栈顶指针了??比如我用“initial_sp”替代“_initial_sp”,那么initial_sp也可以表示栈顶指针了?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:163961 发表于 2017-2-8 22:31 | 只看该作者
好,好,学习,学习学习
回复

使用道具 举报

板凳
ID:123289 发表于 2017-2-12 08:40 | 只看该作者
楼主很认真,将来必成。
1、此句是纯汇编,";"号是汇编的注解标记,无它后面的字符会被认为是语句的一部分,显然“;”后面的不是语句,是注释。
3、猜一下:8字对齐是,不足8个字符时用“空”补足,目的:格式整齐,便于观看。
4、也猜一下: 0x20000388 是位置指针,指示堆栈的位置起点。它等价于0388,因为最前面的20太大,地址溢出了。但20在编译时有用。什么用记不清了,但不妨碍你应用。
5、你说的对。但是你需要保证所有的编译程序都认为“initial_sp表示栈顶指针”。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表