此文档全是 搜索得到 我为自己整合一下方便查看 主要来源与“烹小鲜啊”博主写的非常好
Stack_Size EQU 0x00000100
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
AREA RESET, DATA, READONLY
__Vectors DCD __initial_sp
DCD Reset_Handler
AREA |.text|, CODE, READONLY
THUMB
REQUIRE8
PRESERVE8
ENTRY
Reset_Handler
stack_Size 相当于一个定义 栈的长度,EQU等同于#define
Stack_Size EQU 0x00000100 等同于 #define Stack_Size 0x00000100
AREA STACK, NOINIT, READWRITE, ALIGN=3
AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,说明所定义段的相关属性。
STACK 表示这块区域的名称
NOINIT 表示区域不需要初始化
READWRITE表示区域可读写,可读写的是内存。ROM是只读区域。
ALIGN=3 表示按照 2^3 8字节对齐
Stack_Mem SPACE Stack_Size
SPACE:是申请一片内存的空间。结合上面的意思就是 这里我搞了256字节(Stack_Size = 0x100)的空间,相当于建了一个256字节的buf。给这个buf取个名字叫“栈”
__initial_sp 表示这块区域的高地址
如果这样写
AREA STACK, NOINIT, READWRITE, ALIGN=3
__initial_sp
Stack_Mem SPACE Stack_Size
表示的地址如下图所示
为什么STACK是__initial_sp 是高地址
堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈。(压栈时先修改sp,后数据压栈;出栈时先数据出栈,后修改sp)
堆栈指针指向下一个待压入数据的空位置,称为空堆栈。(压栈时先数据压栈,后修改sp;出栈时先修改sp,后数据出栈)
AREA RESET, DATA, READONLY
指定RESET区域,DATA表示数据,READONLY表示只读表示在ROM区域。
__Vectors DCD __initial_sp
DCD Reset_Handler
__Vectors 表示中断向量表
DCD 表示申请 32bit 并且初始化为后面的标号内容
实际上后面的内容都是函数名,表示函数的地址。
AREA |.text|, CODE, READONLY
选择 |.text| 这个段,CODE表示代码段,READONLY表示只读,所以是ROM区域FLASH上。
THUMB :使用Thumb汇编代码
REQUIRE8:指定这个文件要8字节对齐
PRESERVE8:令指定的这个文件保持8字节对齐
ENTRY
ENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
使用示例:
AREA Init ,CODE ,READONLY
ENTRY ; 指定应用程序的入口点