基于stm32f103c8t6芯片的启动文件进行分析。
启动文件在嵌入式芯片开发是必不可少的,其文件后缀是.s,通常需要加入工程参与编译。它的的用包括一下几点:
- 开辟栈、堆的空间。
- 初始化中断向量表。
- 调用外部SystemInit函数,初始化时钟。
- 调用C库函数__main初始化用户栈,调用main函数转到C世界。
启动文件使用汇编语言编写,如果熟悉汇编语言,那么很容易理解它;如果不熟悉汇编语言,针对启动文件里用到的汇编指令,下面会一一介绍。
1.启动文件使用到的汇编指令
指令名称 |
作用 |
EQU |
给数据常量起一个符号名,相当于C语言的#define |
AREA |
汇编一个新的代码段或者数据段 |
SPACE |
分配内存空间 |
PRESERVE8 |
告诉编译器,指定当前文件的堆按照8字节对齐 |
THUMB |
表示后面指令兼容THUMB指令。 |
EXPORT |
声明一个标号具有外部属性,可在外部文件使用 |
DCD |
以字节为单位,按照4字节对齐,并要求初始化这些内存 |
PROC |
定义子程序,与ENDP成对使用,表示子程序结束。 |
WEAK |
编译器指令(不同的编译器有差异),弱定义一个标号,如果外部文件声明了该标号,则优先使用外部文件的定义。避免出现重定义错误。 |
IMPORT |
声明标号来自外部文件,相当于C语言的extern |
B |
跳转到一个标号 |
ALIGN |
编译器指令(不同的编译器有差异),编译器对指令或数据的存放地址进行对齐,一般跟一个立即数,默认表示按照4字节对齐。 |
END |
文件结束标志 |
IF,ELSE,ENDIF |
汇编条件分支语句,相当于C语言的#if #else #endif |
; |
行注释起始符号,相当于C语言的“//“ |
2.启动文件代码分析
Stack_Size EQU&nbs