第48~52行:定义了一段大小为1KB的堆栈空间,并初始化为0。(堆栈也叫栈)
第48行:定义一个变量Stack_Size,并赋值为0x00000400;
第50行:定义一个数据段(或数据节)STACK,不零初始化,可读可写,并以8个字节对齐;
第51行:开辟一个大小为0x00000400(即1KB)的初始化为零的连续的内存空间,并命名为Stack_Mem;
第52行:_initial_sp是标号,表示堆栈的栈顶地址。
第59~64行:定义了一段大小为0.5KB的堆空间,并初始化为0。由于未用到编译器自带的内存管理(malloc , free等),不会用到堆,故可以将堆大小设置为0。
第59行:定义一个变量Heap_Size,并赋值为0x00000200;
第61行:定义一个数据段HEAP,不初始化为零,可读可写,并以8个字节对齐;
第62行:_heap_base是标号,表示堆基地址;
第63行:开辟一个大小为0x000000200(即512Bytes)的初始化为零的内存空间,并命名为Heap_Mem;
第64行:_heap_limit是标号,表示堆顶地址。
第66行:PRESERVE8表示当前文件中的堆栈区按8字节对齐;
第67行:THUMB指示汇编器将THUMB后的指令翻译成T32。
第71~190行:系统复位时,向量表被映射到零地址。
第71行:定一个代码段RESET,只可读;
第72~74行:分别定义3个全局变量 _Vectors 、_Vectors_End 及_Vectors_Size;
第76~186行:分别定义了多个连续的字存储单元,这些存储单元用于存储向量表。标号_Vectors是栈顶地址 _initial_sp,__Vectors_End表示向量表的结尾地址。
第188行:定义一个变量__Vectors_Size 用于表示向量表的大小;
第190行:定义一个代码段|.text|,只可读;
第193~202行:复位处理程序,可根据实际情况进行修改。
第193行:Reset_Handler是标号。PROC表示程序的开始。
第194行:定义一个全局变量Reset_Handler,并指定为[weak](若用户没有定义同名的Reset_Handler函数,则就去执行第195~202行的程序)。
第195~196行:告知编译器,SysemInit和_main是两个在其他文件中定义过的符号名(或函数名)。
第206~246行:空异常处理程序(函数入口)。其中,”B .”表示跳转到当前指令,所以也就是进入无限循环当中。ENDP表示程序结束。
第248~433行:空异常处理程序。系统默认的处理程序和全局符号。
第440~449行:用户栈和堆初始化程序。
第440行:IF…ELSE…ENDIF结构。如果使用(或定义)_MICROLIB,那么,定义了3个全局属性变量。否则,定义一个全局属性的标号__user_initial_stackheap,并且通知编译器本文件中应用的_use_two_region_memory在其他文件中定义了。注意:MiCROLIB缺省的情况下使用的是Keil C库。
第453~460行:分别将栈顶地址,栈底地址,堆顶地址及堆基地址存放在寄存器R1,R3,R0,R2中。
注意:堆区和栈区的名称分别代表堆区和栈区的起始地址,由于栈逆生长,所以它的名称代表栈区的栈底地址。 |