该文件主要实现目的:
设置初始SP
设置初始PC=Reset_Handler
设置向量表入口地址,并初始化向量表
调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义
调转到标号_main,最终来到C程序文件
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
第一行是程序注释,在汇编里面注释用的是“;”。
第二行是定义了一个子程序:Reset_Handler。
PROC 是子程序定义伪指令。一般用法为:
1 子程序名PROC NEAR ( 或FAR )
2 ……
3 ret
4子程序名ENDP
其中NEAR 和FAR 是属性词。 NEAR属性(段内近调用):
调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用。
FAR属性(段间远调用):调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用。
第三行EXPORT 表示Reset_Handler 这个子程序可供其他模块调用。
关键字[WEAK]
表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。
第四行和第五行IMPORT 说明SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。
SystemInit在库文件system_stm32f10x.c 实现,用来初始化STM32的一系列时钟,把系统时钟设置为72MHZ。STM32的时钟比51 单片机复杂,需要经过一系列的配置才能达到稳定运行的状态。
__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统境,并在最后跳转到用户自定义的main函数,从此来到C的世界。
第六行把SystemInit 的地址加载到寄存器R0。
第七行程序跳转到R0 中的地址执行程序,之后系统的时钟就被设置成72MHZ。
第八行把_main 的地址加载到寄存器R0。
第九行程序跳转到R0 中的地址执行程序,执行完毕之后就去到我们熟知的C 世界。
第十行表示子程序的结束。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』