实验内容:参考作业附件或者博客 “ 基于MDK创建纯汇编语言的STM32工程 ”,在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容。
一、新建项目
1)新建工程
点击 Project ——> New uVision Project 创建新项目:
输入工程名:
2)配置环境
设置工程的目标环境STM32F103C8:
在CMSIS下选择CORE,Device下选择Startup:
右击 Source Group 1 ,点击 Add New Item to Group:
点击 Asm Files (.s)创建汇编文件 ,输入文件名:
完成结果:
二、测试代码
1)编写代码
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
MOV R0, #10
MOV R1, #11
MOV R2, #12
MOV R3, #13
;LDR R0, =func01
BL func01
;LDR R1, =func02
BL func02
BL func03
LDR LR, =func01
LDR PC, =func03
B .
func01
MOV R5, #05
BX LR
func02
MOV R6, #06
BX LR
func03
MOV R7, #07
MOV R8, #08
BX LR
2)设置仿真器
点击 魔法棒 ,在 Output 中勾选 Create HEX File 生成 hex 文件:
在debug中选择“Use Simulator”,设置Dialog DLL项为“DARMSTM.DLL”,parameter项为“-pSTM32F103C8”:
3)编译调试
编译工程:
调试模式:
结果符合预期,寄存器R5,R6,R7,R8的值和程序设置一致:
三、分析 hex 文件
1)hex文件
最终生成的 hex 文件的各段大小:
用记事本打开 hex 文件:
2)hex文件格式
Intel HEX 由任意数量的十六进制记录组成,每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc。每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字;每一个域由至少两个十六进制编码数字组成,它们构成一个字节。
3)前8个字节的内容含义
以此文件为例:
:020000040800F2 //==文件第一行==
例::020000040800F2
02:代表本行有2个字节数据
0000:本行数据的起始地址(偏移地址)
04:扩展线性地址标识,表面后面2个字节数据是后面数据的基地址
注:由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,故有了扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位,扩展线性地址记录总是有两个数据字节。
0800:是扩展地址 (0x0800 << 16) = 0x08000000后面的数据记录都以这个地址为基地址。
F2: 记录本行校验和 F2=0x100-(0x02+0x04+0x08)
四、实验总结
通过完成本次实验——基于MDK创建纯汇编语言的STM32工程,我了解了STM32汇编语言的知识,明白了hex文件的格式和数字段的意义,对以后更加深入地学习STM32汇编打下了良好的基础。
五、参考资料
1、ARM汇编基础之基于MDK创建纯汇编语言的STM32工程链接
2、基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容链接
3、基于MDK使用汇编语言创建STM32工程链接