下[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个伪指令“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也可以表示栈顶指针了? [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] |
分号是注释符,相当于C语言中//
Cortex-M架构要求堆栈8字节对齐,特别是进入异常的时候。
标号就是地址,没有地址怎么访问该内存区域呢,标号是该内存区域的首地址。
不要忘了Cortex-M向量表的第一项就是栈顶地址,向量表引用的符号要和这里定义的相一致。
评分
查看全部评分
2.8字节对齐是规定,具体看ARM v7-m的架构。但理论上按照2的幂次对其都是合理的,关键实现复杂度如何减小。
3.在汇编操作符或伪指令前面的都是标号。标号就代表了起始地址,类似函数名就是其起始地址。map中的value列表示其值,size表示大小,1024就是其大小。
你从哪抄的这个启动文件,我给你个,__initial_sp一般处在代码段中:
评分
查看全部评分
存储起始地址只能是XXX0或XXX8,也就是起始地址的低3位必须为0,也就是为什么ALIGN=3 ,3就是这么来的
是没必要的,汇编程序员的通常还是C程序员,顺手来了个分号
建议点“回复”
都点赞