文章目录
一、新建工程
1.1新建项目
双击打开MDK5
在菜单栏中点击project
设置文件路径及名称:
二、配置环境
2.1选择芯片
设置工程的目标环境,本次实验博主个人采用STM32F103ZET6芯片
点击确定即可
2.2选择运行环境
芯片选择结束后在弹出界面选择以下信息:
1.CMSIS下选择CORE
2.Device下选择Startup,其中包含了启动文件
2.3添加源文件
选择添加文件后:
1.选择Asm File(.s),创建汇编文件
2.设置源文件名称
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 ‘Target1’并点击,选择Debug->Use Simulator,将Dialog DLL以及Paraneter修改为自己设备即可。
3.3编译调试
点击build进行编译,编译成功后点击红色按钮进行仿真
点击Run
而后点击旁边的Stop,观察结果
可以看出寄存器R5、R6、R7及R8的值与程序设计一致:
四、分析Hex文件
4.1Hex文件
运行前需提前勾选生成Hex文件
在项目文件夹中找到projects查看Hex文件
hex文件内容如下:
:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B70470000A50200087901000817
:100160000000002000060020000200200002002005
:1001700070477047704700004FF00A004FF00B01C6
:100180004FF00C024FF00D0300F009F800F00AF8F0
:1001900000F00BF8DFF81CE0DFF81CF0FEE74FF092
:1001A000050570474FF0060670474FF007074FF000
:1001B000080870479F010008AB01000810B500F067
:1001C00001F810BD0CB50020019000903348006884
:1001D00040F480303149086000BF3048006800F4C6
:1001E000003000900198401C0190009818B90198C7
:1001F000B0F5A06FF1D12948006800F4003010B1CB
:100200000120009001E0002000900098012843D1D7
:100210002348006840F01000214908600846006843
:1002200020F0030008600846006840F00200086003
:100230001A484068194948600846406848600846BE
:10024000406840F4806048600846406820F47C10B4
:1002500048600846406840F4E81048600846006876
:1002600040F08070086000BF0C48006800F000702B
:100270000028F9D00948406820F003000749486089
:100280000846406840F00200486000BF03484068EC
:1002900000F00C000828F9D10CBD0000001002404D
:1002A0000020024010B51348006840F001001149D9
:1002B000086008464068104908400E4948600846F2
:1002C00000680E4908400B4908600846006820F4A1
:1002D000802008600846406820F4FE0048604FF423
:1002E0001F008860FFF76AFF4FF000600449086054
:1002F00010BD0000001002400000FFF8FFFFF6FEF6
:0403000008ED00E024
:040000050800017975
:00000001FF
4.2扩展线性地址
- 扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录或 HEX386 记录
- 这些记录包含数据地址的高 16 位
- 扩展线性地址记录总是有两个数据字节,外观如下(这里我通过标记方便对应原始数据)
以020000040800F2为例
内容 | 描述 |
---|---|
02 | 数据字节数量 |
0000 | 地址域,对于扩展线性域,这个域总是0000 |
04 | 记录类型04 |
0800 | 地址的高16位 |
F2 | 是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h) |
- 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
- 线性地址保持有效,直到它被另外一个扩展地址记录所改变
- 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址
4.3数据部分
- Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc
- 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字
- 每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样(以:laaaatt[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.4文件尾
在文件的最后一排,是一个文件的结束标志::00000001FF
内容 | 描述 |
---|---|
:00000001FF | |
00 | 记录的长度为 0 |
0000 | LOAD OFFSET为0000 |
01 | TYPE = 01 |
FF | 校验和为FF |
这个是一个 END OF FILE RECORD,标识文件的结尾
版权声明:本文为qq_54347584原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。