你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

启动文件 startup_stm32f429xx.s 中的汇编语言疑问?

[复制链接]
mickey_0415 提问时间:2017-2-8 14:46 /
下[img=0,1]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1064956213\QQ\WinTemp\RichOle\$B2U~8%AN5J(Z{H)63OR[RL.png[/img]面的代码是从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也可以表示栈顶指针了?
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1064956213\QQ\WinTemp\RichOle\$B2U~8%AN5J(Z{H)63OR[RL.png[/img]

[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1064956213\QQ\WinTemp\RichOle\$B2U~8%AN5J(Z{H)63OR[RL.png[/img][img=0,1]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1064956213\QQ\WinTemp\RichOle\$B2U~8%AN5J(Z{H)63OR[RL.png[/img]



stack.png
收藏 1 评论12 发布时间:2017-2-8 14:46

举报

12个回答
zoomdy 回答时间:2017-2-8 18:24:17
(1)这4行语句中有3个伪指令“EQU,AREA ,SPACE”,共4行代码,只有第1行的代码后面有一个分号“;”,其他3行都没有,这是怎么回事?

分号是注释符,相当于C语言中//

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

Cortex-M架构要求堆栈8字节对齐,特别是进入异常的时候。

(4)第3行代码中,SPACE   Stack_Size是开辟一个大小为0x400的内存空间,那么"Stack_Mem"是标号吗?是表示开辟的这个内存空间的名称是Stack_Mem么?本来我也认为Stack_Mem是一个定义的内存空间的名称,可是在“.MAP”文件中,Stack_Mem的值却是个地址(如下灰色区域所示),可以看出Stack_Mem==0x20000388,它不是内存空间么,怎么会是0x20000388?而不是0x400=1024KB,为什么?

标号就是地址,没有地址怎么访问该内存区域呢,标号是该内存区域的首地址。

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

不要忘了Cortex-M向量表的第一项就是栈顶地址,向量表引用的符号要和这里定义的相一致。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

moyanming2013 回答时间:2017-2-8 18:24:25
1.分号是注释的开始。
2.8字节对齐是规定,具体看ARM v7-m的架构。但理论上按照2的幂次对其都是合理的,关键实现复杂度如何减小。
3.在汇编操作符或伪指令前面的都是标号。标号就代表了起始地址,类似函数名就是其起始地址。map中的value列表示其值,size表示大小,1024就是其大小。
你从哪抄的这个启动文件,我给你个,__initial_sp一般处在代码段中: QQ截图20170208182403.jpg

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zoomdy 回答时间:2017-2-8 18:25:17
学习很认真,为你点赞
zoomdy 回答时间:2017-2-8 18:29:22
这个8字节对齐是什么概念?

存储起始地址只能是XXX0或XXX8,也就是起始地址的低3位必须为0,也就是为什么ALIGN=3 ,3就是这么来的
mickey_0415 回答时间:2017-2-8 19:52:03
谢谢您的解答,十分感谢!对于第1行代码中的分号“;”,本来我也认为是注释,可是这个分号后面并没有注释的内容,还不如不加这个分号去呢!是不是?
队长shiwo 回答时间:2017-2-9 08:56:28
学习了  ,,
zoomdy 回答时间:2017-2-9 12:40:23
mickey_0415 发表于 2017-2-8 19:52
谢谢您的解答,十分感谢!对于第1行代码中的分号“;”,本来我也认为是注释,可是这个分号后面并没有注释 ...

是没必要的,汇编程序员的通常还是C程序员,顺手来了个分号
mickey_0415 回答时间:2017-2-9 13:47:26
不过,我突然 发现,上面顶格书写的语句中,语句末尾没加分号的都是以标号起始的,加了分号的确实个变量。这样做可以区分变量和标号。
moyanming2013 回答时间:2017-2-9 14:56:54
mickey_0415 发表于 2017-2-9 13:47
不过,我突然 发现,上面顶格书写的语句中,语句末尾没加分号的都是以标号起始的,加了分号的确实个变量。 ...

建议点“回复”
斜阳 回答时间:2017-2-9 15:27:19
一楼二楼讲解很详细
zbber 回答时间:2017-2-10 07:39:59
学习很认真,为你点赞
wolfgang 回答时间:2017-2-10 14:14:15
学习得认真,解答的人详细~~~
都点赞

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版