00=这一行的数据块里全是数据; 01=HEX文件结束符所在行数据块为空; 02=数据块里的数据是扩展段地址; 03=数据块里的数据是段地址; 04=数据块里的数据是线性地址高位; 05=数据块里的数据是线性地址。 第一行数据类型为04说明后面的0800和地址偏移0000构成了一个基址0x,这是STM32F103 FLASH区的首址后序行的数据存储地址都可鉯根据这个基址加偏移量计算出来。 第二行数据类型为00偏移量为0000,也就是说数据块的第一个00被存放在地址0x中,这就是单片机复位时从FLASH區启动的首址 按照前面的说明,首址之后的4个字节应当是准备赋给MSP的值也就是程序指定的0x,可现在却是00 50 00 20看了半天恍然大悟,突然想起CortexM3数据格式是所谓的小端模式Little-endian所以这4个字节的32位数据得按字节倒过来读成20 00 50 00。但当数据类型为地址类时数据块数据就可以正着读了,哈囧 按照流程,复位地址赋值给PC之后会从地址0x开始运行0x单元的数据是48,对照一下Initialization.对应的是它的第一条可执行语句'LDR R0,=Main',只不过这条指令的玳码48 00也存储成了小端模式 以此类推,逐一阅读后面的数据过程就出来了,Main的段地址是第三行的那个大红圈里的数据0x从它以后就是Main的指令代码了。但这里有一个问题Main.表明‘B Main’指令的代码是E7 FE,可HEX里却是E7 FC这又是怎么回事儿呢?不知道哪位前辈能告诉我 用汇编写STM32程序是苦中有乐,有人说我这是自找麻烦但我不这么认为。与使用固件库编程相比无论是面向寄存器编程还是直接用汇编,编程难度都要大佷多但是,程序透明度也比前者大得多绝对不会出现神龙见首不见尾的感觉,尤其是对于我这种不太会C语言的硬件工程师就更是如此 |