当前位置:   article > 正文

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

stm32 汇编

一、新建工程

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里插入图片描述

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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
0000LOAD OFFSET为0000
01TYPE = 01
FF校验和为FF

这个是一个 END OF FILE RECORD,标识文件的结尾

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/75861
推荐阅读
相关标签
  

闽ICP备14008679号