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

启动文件 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
不过,我突然 发现,上面顶格书写的语句中,语句末尾没加分号的都是以标号起始的,加了分号的确实个变量。 ...

建议点“回复”
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版