CPU的汇编启动代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CPU的汇编启动代码相关的知识,希望对你有一定的参考价值。

在学习STM32的时候一直看不明白Startup_stm32f40_41xxx.s这个文件。里边写的每句话好像也能看懂但是就不知道他想干嘛。现在终于有点体会了所以来在这里记录下来,希望能对后来的人有帮助。
1、首先启动代码要确定的是都用汇编来写,因为C语言是不能实现的。这个原因是因为C语言想要运行必须要有堆栈的支持,如果没有堆栈(这里最重要的是栈,因为堆可能不需要)那么C程序运行后就会指向了一个不知道什么地方的地方就会出错程序就跑飞了。从这里看C不是不能执行是执行了就肯定会出错。因此必须要用汇编来给C搭建好栈空间好让他正确执行。
2、启动代码也并不是所有的硬件都需要,比如我们用C51的时候就没有看到这个启动代码,上来就用C来写程序了。这是因为C51的硬件内部完成了c所需要的栈所以能执行,还有就是普通PC,他的启动代码是在Bios(BIOS应该是一块很小的NorFlash吧,好像记得是)里烧写好了他做的启动工作里有一部分肯定是栈和堆的初始化。STM32的启动代码是厂家给你写好的可以看到开头就有如下内容
Stack_Size EQU 0x00000400

            AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size
__initial_sp

可以看到大小是1K的一个栈直接初始化了CPU的SP指针也就是说把栈初始化好了。因为在ARM中SP就是r13随便上网查一下就知道了。
还用STM32的启动代码来说接着就是异常向量表,这个不用管这是硬件规定好的名字你想改也不能改(最多也就是用#define来包装一层),之后就是Reset_Handler这个标签也就可以认为是C中的函数吧。跟着是
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
跳转到SystemInit因为用的是BL所有能返回来,在调用就是我们写的main函数了用bx调用所有就不用返回了。
3、总结一下也就是说一般这种嵌入式或者是单片机的启动代码一般只做时钟初始化、关闭看门狗(可能有的CPU硬件里边已经给你做了)、还有就是初始化栈和堆接着就可以跑你的C程序了。也就是加载bootloder和操作系统什么的吧。

以上是关于CPU的汇编启动代码的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义 CPU 创建 C 编译器?

stm32启动过程cortex-m3架构堆栈代码位置编译汇编链接分析

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

[汇编语言]实验一:查看CPU和内存,用机器指令和汇编指令编程。

kernel启动分析

如何实现可自我迭代的计算机