要注意的两个事:所有指令都不能顶格写
所有标号必须顶格写
;*****************************申请一个栈空间*****************************
Stack_size EQU 0x200 ;定义一个堆栈的大小,相当于宏定义
AREA STACK ,NOINIT,READWRITE,ALIGN=3
;AREA 申请一段内存
;duizhan 这一段内存的名字
;NOINIT 不要初始化
;READWRITE 表示这一段内存空间可读可写
;ALIGN=3 设置2^3对齐 即8字节对齐 原因有浮点数和long long数据运算 SPACE Stack_size ;SPACE x 含义是指定一段内存空间的大小
;这条伪指令的意思是开辟一块x字节的区域用来作为主堆栈
_init_msp
;__init_msp是一个标号 即标记主堆栈的地址
;因为STM32是 满递减堆栈 所以在内存段申请后定义标号
;************************************************************************
;*******************************全局设置*********************************
IMPORT main ;引入符号,函数名也是一个标号,这句话说明函数源自于其他文件
PRESERVE8 ;设置堆栈8字节对齐
THUMB ;指定编译器为thumb指令集
;***********************************************************************
;*************************定义一个RESRT段********************************
;RESET段是keil默认最先链接的段
AREA RESET,DATA,READONLY
;Cotex4 M4 中段向量表,其实就是一个数组,这个数组中的第一个元素存储主堆栈的地址
; _Vectors[0] = __init_msp
; _Vectors[1] = start 即标记RESET的起始地址
_Vectore
DCD _init_msp ;中断向量表第0个元素存储主堆栈地址
DCD _start ;中断向量表的第二个存储 代码段的地址 start的含义是第一个开始执行的位置
SPACE 0x400 ;每一个中断都需要一个对应的地址,要预留其他中断号的地址
;*************************************************************************
;******************************定义一个代码段******************************
AREA |.text|,CODE,READONLY
;定义一个代码段 名字为 .text 权限为只读
_start PROC ;将这一段在调用时作为过程调用,
;仿真时更详细代码内容在这里编写
BL main
ENDP
END