基于STM32芯片的汇编程序编写

文章目录

  • 一、新建工程
    • 1.1新建项目
  • 二、配置环境
    • 2.1选择芯片
    • 2.2选择运行环境
    • 2.3添加源文件
  • 三、测试
    • 3.1测试代码
    • 3.2仿真器设置
    • 3.3编译调试
  • 四、分析Hex文件
    • 4.1Hex文件
    • 4.2扩展线性地址
    • 4.3数据部分
    • 4.4文件尾

一、新建工程

1.1新建项目

双击打开MDK5
在菜单栏中点击project
基于STM32芯片的汇编程序编写_第1张图片
设置文件路径及名称:
基于STM32芯片的汇编程序编写_第2张图片

二、配置环境

2.1选择芯片

设置工程的目标环境,本次实验博主个人采用STM32F103ZET6芯片
基于STM32芯片的汇编程序编写_第3张图片
点击确定即可

2.2选择运行环境

芯片选择结束后在弹出界面选择以下信息:
1.CMSIS下选择CORE
2.Device下选择Startup,其中包含了启动文件
基于STM32芯片的汇编程序编写_第4张图片

2.3添加源文件

基于STM32芯片的汇编程序编写_第5张图片
选择添加文件后:
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

基于STM32芯片的汇编程序编写_第6张图片

3.2仿真器设置

点击菜单栏中的project,找到Options for ‘Target1’并点击,选择Debug->Use Simulator,将Dialog DLL以及Paraneter修改为自己设备即可。
基于STM32芯片的汇编程序编写_第7张图片

3.3编译调试

点击build进行编译,编译成功后点击红色按钮进行仿真
基于STM32芯片的汇编程序编写_第8张图片
基于STM32芯片的汇编程序编写_第9张图片
点击Run
基于STM32芯片的汇编程序编写_第10张图片
而后点击旁边的Stop,观察结果
基于STM32芯片的汇编程序编写_第11张图片
可以看出寄存器R5、R6、R7及R8的值与程序设计一致:
基于STM32芯片的汇编程序编写_第12张图片

四、分析Hex文件

4.1Hex文件

运行前需提前勾选生成Hex文件
基于STM32芯片的汇编程序编写_第13张图片
在项目文件夹中找到projects查看Hex文件
基于STM32芯片的汇编程序编写_第14张图片
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,标识文件的结尾

你可能感兴趣的:(stm32,单片机,物联网)