声明:这次讲解真的超级详细,根据标准库的启动文件,一步步介绍的。看的时候可以与启动文件一起查看学习。
1、栈
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
【解释EQU】给数字常量取一个名字,相当于C 语言中的define
【解释AREA STACK】 标明汇编一个新的代码段或者数据段 段名字为STACK
【解释NOINIT】 不初始化
【解释READWRITE】 表示这个段内容是可读可写的
【解释ALIGN】编译器对指令或者数据的存放地址进行对齐,这里是8字节对齐(2^3)
【解释SPACE】 这个指令标明分配内容空间
【解释 SPACE Stack_Size】 分配大小为Stack_Size的空间
【解释__initial_sp】在initial_sp之前分配了1KB字节大小的空间,initial_sp表示栈的结束地址。比如我的此时__initial_sp值为0x20000608,因为大小位0x400,所以栈开始地址是0x2000_0208。有的朋友可能会问没什么不是从0x2000_0000开始,我这里使用了堆。堆的空间范围是0x20000008——0x20000208。
拓展:有的同学可能好奇,0x2000_0000与0x2000_0004呢?
0x20000000 存的是 __microlib_freelist
0x20000004 存的是 __microlib_freelist_initialised
我这里是使用了微库(MicroLIB)(KEIL软件的魔术棒->target)
总结:开辟一个大小位0x0000_0400(1KB)大小的栈空间,段名字为STACK,内部是8字节对齐,段内空间数据是可读可写的。
有朋友可能会问,什么东西会存放到栈呢?
所有的局部变量等等。比如我这里写了 int add (int a, int b)函数,那么当程序执行到这个函数的时候,会把这个函数内部定义的局部变量,存放到栈中。
2、堆
首先说明:堆空间的真正开辟是在项目中有使用malloc函数申请内存。如果没有使用malloc,那么虽然在.s文件中定义了分配堆空间,实际情况下,堆空间是没有开辟的。
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size

最低0.47元/天 解锁文章
2981

被折叠的 条评论
为什么被折叠?



