基于STM32汇编程序的编写
由于本人的环境在之前已经搭建完成,大家可以看看其他人的文章
1新建工程
双击打开MDK5.26,启动界面如下所示;
点击菜单栏的Project,在弹出的窗口点击选项New uVision Project,创建新的工程;
在弹出的窗口分别设置;
- 设置项目工程的路径
- 设置项目工程的名称,这里使用TEST
- 点击保存
2 配置环境
2.1 选择设备
设置工程的目标环境,本文基于STM32F103ZET6,因此在弹出的窗口选择相应的选项,点击保存即可
2.2 选择运行环境
ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
- CMSIS下选择CORE
- Device下Startup,其中包含了启动文件
2.3 添加源文件
鼠标右键单击Source Group 1
添加源文件,因为创建汇编项目;
- 选择 Asm File (.s) ,创建汇编文件
- 设置源文件的名称
- 点击保存
3 测试代码
3.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
3.2 仿真器设置
点击菜单中的Project,找到Options for Target ‘Target 1’并点击,选择Debug–>Use Simulator,将Dialog DLL以及Parameter处修改为自己选择的设备,OK。
3.3 编译调试
点击build进行编译,编译成功后点击红色按钮进入仿真
先点击run按钮 再点击旁边的stop按钮,最后可以看到,结果符合预期,寄存器R5 ,R6 ,R7 ,R8 的值和程序设置一致,具体如下图所示;
4分析HEX文件
1.hex 文件
最终生成的 hex 文件的各段大小
用记事本打开 hex 文件,都是一连串的十六进制
:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B7047000041020008990200085A
:100160000000002000060020000200200002002005
:10017000704770477047000080B500F001F880BDFF
:1001800082B041F204000021C4F20200019100910A
:1001900050F8041C41F4803140F8041C50F8041C51
:1001A00001F400310091019901310191009919B9CF
:1001B0000199B1F5A06FF1D150F8041C890354BF27
:1001C0000021012100910099012936D142F200015C
:1001D000C4F202010A6842F010020A600A6822F0C2
:1001E00003020A600A6842F002020A6001680160C4
:1001F00001680160016841F480610160016821F4D7
:100200007C110160016841F4E811016050F8041CA0
:1002100041F0807140F8041C50F8041C8901FBD5A2
:10022000016821F003010160016841F002010160F1
:10023000016801F00C010829FAD102B070470000F2
:1002400080B541F20000C4F202000168002241F0D2
:10025000010101604168CFF6FF0211404160016871
:100260004FF6FF72CFF6F66211400160016821F48B
:1002700080210160416821F4FE0141604FF41F01BB
:100280008160FFF779FF4EF60850CEF200004FF084
:100290000061016080BD00004FF00A004FF00B01CB
:1002A0004FF00C024FF00D0300F009F800F00AF8CF
:1002B00000F00BF8DFF81CE0DFF81CF0FEE74FF071
:1002C000050570474FF0060670474FF007074FF0DF
:0C02D00008087047BF020008CB020008BD
:040000050800029954
:00000001FF
2.扩展线性地址记录
- 扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录或 HEX386 记录
- 这些记录包含数据地址的高 16 位
- 扩展线性地址记录总是有两个数据字节,外观如下(这里我通过标记方便对应原始数据)
内容 | 描述 |
---|
:020000040800F2 | | 02 | 这个记录当中数据字节的数量 | 0000 | 地址域,对于扩展线性地址记录,这个域总是 0000 | 04 | 记录类型 04 (扩展线性地址记录) | 0800 | 是地址的高 16 位 | F2 | 是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h) |
- 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
- 线性地址保持有效,直到它被另外一个扩展地址记录所改变
- 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址
3.数据部分
-
Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc -
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字 -
每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
内容 | 描述 |
---|
:llaaaatt[dd…]cc | | : | 每个Intel HEX记录都由冒号开头 | ll | 数据长度域,它代表记录当中数据字节(dd)的数量 | aaaa | 地址域,它代表记录当中数据的起始地址 | tt | 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线 | dd | 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符 | cc | 校验和域,它表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足) |
-
Intel HEX文件由任意数量以回车换行符结束的数据记录组成 -
这里我们随便拿一条数据记录分析,比如第二条吧
内容 | 描述 |
---|
:100000001806002031010008390100083B010008F2 | | 10 | 这个记录当中数据字节的数量 | 0000 | 数据将被下载到存储器当中的地址 | 00 | 记录类型(数据记录) | 1806…0008 | 数据 | F2 | 这个记录的校验和 |
4.文件尾
5总结
通过本实验,了解HEX文件内容和知道了使用仿真器模式调试时要根据选择的设备更改参数。后面可以配合硬件,把每一条指令过一遍,从而加深理解
6参考资料
基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容
搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写 模式调试时要根据选择的设备更改参数。后面可以配合硬件,把每一条指令过一遍,从而加深理解
|