在IAR环境下stm32的汇编启动引导代码中有如下内容
这是一个IAR内部定义的函数,基本是一些为运行C语言准备运行环境的初始化的操作。
总之,IAR在启动main()函数以前,
①首先执行了Reset_Handler
②调用SystemInit()(ST库提供)进行对单片机的时钟,Flash读取初始化,
③并转入__iar_program_start中执行__low_level_init与__iar_data_init2,并在__iar_data_init2中,先后调用__iar_zero_init2与__iar_copy_init2对全局变量、全局已初始化变量进行相应的初始化操作。
④最后调用main()函数执行。
************************************************************************************************************************************
可查看官方文档查看__iar_program_start的作用,打开IAR->help->C/C++ Development Guide。
想看具体代码方法如下:
这个__iar_program_start一般定义在在cstartup的文件中,具体是哪个文件需要查看.map文件,如下我们找到了这个文件名(还有一些文件名是工程中没有出现的,那就是IAR的库提供的比如zero_init3.o,low_level_init.o,这些文件一般在IAR安装目录内搜的到)。
.text ro code 0x800'1560 0xc cstartup_M.o [3]
IAR额外使用的文件
.text ro code 0x800'0d80 0xa6 ABImemcpy.o [3]
.text ro code 0x800'0e26 0x3a zero_init3.o [3]
.text ro code 0x800'143c 0x2c copy_init3.o [3]
.text ro code 0x800'1468 0x28 data_init.o [3]
.text ro code 0x800'14f8 0x1e cmain.o [3]
.text ro code 0x800'1516 0x4 low_level_init.o [2]
.text ro code 0x800'151a 0x4 exit.o [2]
.text ro code 0x800'1520 0xa cexit.o [3]
.text ro code 0x800'152c 0x14 exit.o [4]
.text ro code 0x800'1560 0xc cstartup_M.o [3]
搜索一下这个文件,有两个,一个汇编一个C文件。
通过查看map文件发现这些函数都是通过.a的静态库文件提供的
dl7M_tlf.a: [2]
exit.o 4
low_level_init.o 4
-------------------------------------------------
Total: 8
rt7M_tl.a: [3]
ABImemcpy.o 166
cexit.o 10
cmain.o 30
copy_init3.o 44
cstartup_M.o 12
data_init.o 40
zero_init3.o 58
-------------------------------------------------
Total: 360
shb_l.a: [4]
exit.o 20
-------------------------------------------------
Total: 20
尝试对其进行反汇编,暂时没找到反汇编的方法。
那换一种方式,直接反汇编生成的工程文件,反汇编工具D:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\binielfdumparm.exe可反汇编elf格式文件, hex、bin文件不是elf是不行的,在Exe文件夹有一个.out文件,这个可以被反汇编。
在windows terminal使用如下命令进行反汇编
cd D:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin
.\ielfdumparm.exe -a --source D:\TestIAR\pro.out -o D:\TestIAR\bin.s
得到的汇编文件非常大,行数有23000+。重新编译了一个简单的工程尽量减小代码量,再进行反汇编。减小到了5200行。
由于太简单没有一些RAM的初始化等操作,再修改一下加上了初始化的数组、初始为0的数组、未初始的数组。
(因为Cortex-M3内部使用了指令流水线,读取PC内容时返回的值是当前指令的地址+4。如要与PC进行计算需要注意这一点)
突然想起来IAR仿真时会显示反汇编,查看通用寄存器功能,使用仿真调试器,实时查看数值更方便。
以下是执行顺序
__iar_program_start
?main → __low_level_init → __iar_data_init3 → __iar_zero_init3→ __iar_copy_init3:(这些函数初始化了定义了变量的内存,不需要太关心)
_call_main:
main(你写的程序)
***********************************************************************************
搜索《在main()之前,IAR都做了啥》这个写的比较详细。