STM32入门教程——从汇编到 C函数的main

汇编程序放在哪

汇编文件被编译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博客

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值