当前位置:   article > 正文

STM32入门教程——从汇编到 C函数的main_单片机汇编程序转成c语言代码

单片机汇编程序转成c语言代码

汇编程序放在哪

汇编文件被编译link到bin文件中了。先看下工程设置里Link页,

b7c174834ba0474abdfbbde1625064f8.png


ro_base是0x8000000
再看下编译的s文件,定义的RESET 段,

15f71272afe371990fee3177493f5620.png

 

该reset段在map文件中可以找到,如下:

 

42fb97be5e7362ff86f62d012f931a2e.png

那么0x08000000就是汇编程序放置的起始地址吗?我们来证明一下:
1)通过对汇编代码添加测试代码,如下图

9cac5a4532bee5dc82b10bff45d509e6.png


2)将编译生成hex文件后,使用jflash或其它hex阅读软件打开,发现如下:

0e43a410221424cb024559be5f1a9376.png


        即可证明.s文件被连接到hex的开始位置,也就是0x8000000开始的地址处。当然如果sct文件中指定了位置,s文件的位置将会受sct文件影响。如下图,分散加载文件中地址为0x08001000,RESET段的地址也跟着调整。

be4318b0e6294a5e8f12deee363cf635.png

 ba3406abb01945449e9014ca345b26fd.png

 程序是怎么执行的

        link文件通过sct文件得知第一个运行的程序段名称。

62d859155fc44f8bb4b8e3ba85cd799b.png

 

        通过上述SCT文件可知,程序运行的第一个程序段为RESET,RESET段就是stm32 startup汇编文件中定义的。RESET段中先分配了一定数量的存储空间用来存储中断向量,向量表的大小每个芯片不同,最终分配的大小由中断向量个数决定,可以在map文件中看到实际分配的大小,也可以自己数一数计算下看看与map中大小是否一致。这里Reset_Handler的地址就是存放复位向量的。当芯片复位后,会进到复位中断处理函数处执行,即如下代码:

 

14bf6ae651c4647b20ef59a59b9c9f4b.png

 

依次执行SystemInit函数及__main函数,注意这里的__main不是我们定义的main,而是C库函数,主要是用来初始化系统堆栈,汇编代码如下:

b46c200b54fb4f0f9f9734db0dadbdc0.png

 

        到此,C语言运行环境就准备好了,__main运行完之后会跳到我们定义的main处运行。

更多单片机入门知识可见:单片机开发_贫民窟的码农的博客-CSDN博客

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/778181
推荐阅读
相关标签
  

闽ICP备14008679号