完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面的代码是从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个伪指令“EQU,AREA ,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也可以表示栈顶指针了? |
|
相关推荐
9个回答
|
|
不要忘了Cortex-M向量表的第一项就是栈顶地址,向量表引用的符号要和这里定义的相一致。
|
|
|
|
1.分号是注释的开始。
2.8字节对齐是规定,具体看ARM v7-m的架构。但理论上按照2的幂次对其都是合理的,关键实现复杂度如何减小。 3.在汇编操作符或伪指令前面的都是标号。标号就代表了起始地址,类似函数名就是其起始地址。map中的value列表示其值,size表示大小,1024就是其大小。 你从哪抄的这个启动文件,我给你个,__initial_sp一般处在代码段中: |
|
|
|
学习很认真,为你点赞
|
|
|
|
存储起始地址只能是XXX0或XXX8,也就是起始地址的低3位必须为0,也就是为什么ALIGN=3 ,3就是这么来的
|
|
|
|
谢谢您的解答,十分感谢!对于第1行代码中的分号“;”,本来我也认为是注释,可是这个分号后面并没有注释的内容,还不如不加这个分号去呢!是不是?
|
|
|
|
学习了 ,,
|
|
|
|
ianwhoani 发表于 2019-2-14 18:14 是没必要的,汇编程序员的通常还是C程序员,顺手来了个分号 |
|
|
|
不过,我突然 发现,上面顶格书写的语句中,语句末尾没加分号的都是以标号起始的,加了分号的确实个变量。这样做可以区分变量和标号。
|
|
|
|
建议点“回复” |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:06 , Processed in 0.915161 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号