MDK下基于STM32纯汇编语言编写与仿真调试

本文将在Keil MDK版 5.18下编写一个基于STM32的汇编语言程序以及在没有硬件条件下对该程序进行仿真调试。进一步地,还将对build生成的hex文件进行分析。

一、编写汇编程序

1.新建工程
点击在这里插入代码片Project,选择New uVison Project,然后输入工程名,点击保存。
在这里插入图片描述
2.配置环境
设置工程的目标环境,根据自己的实际情况选择设备,本文基于STM32F103C8,点击STMicroelectronics,选择STM32F103,找到STM32F103C8
在这里插入图片描述
设置工程的运行环境,CMSIS下选择CORE,ARM的CMSIS已经把开发所需要的软件组件都封装好了,Device下选择Startup,其中包含了启动文件。
在这里插入图片描述

3.添加源文件到工程
点击SourceGroup1,选择图示选项,选择文件按类型为Asm File(.s),创建汇编文件。
在这里插入图片描述
3.添加源码
输入以下代码,点击编译检查是否有语法错误,指令不能顶格写,点击连接

 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
end

传送指令——MOV DST,SRC的功能:(SRC)->(DST),将原操作数传送到目的地址。

二、仿真调试

1.仿真器设置
点击魔法棒,选择Debug,选择Use Simulator,表示使用软件仿真;选择Run to main,表示跳过汇编代码,直接跳到main函数开始仿真;设置“Dialog DLL”项为“DARMSTM.DLL”和“TARMSTM.DLL”;设置“parameter”项为“-pSTM32F103C8”,用于设置支持STM32F103C8的软硬件仿真。
在这里插入图片描述
同样在此界面下选择Output,选择Creat HEX file,在点击build时将生成hex文件,点击保存。
在这里插入图片描述
2.调试
点击Debug,选择Start/Stop Debug Session,进入仿真调试。
在这里插入图片描述
此时报错,此时点击Rebuild即可。
在这里插入图片描述
进入调试界面,按F11键单步执行,观察寄存器变化情况。除了R0-R3和R5-R8,R13(堆栈指针SP)、R14(连接寄存器LR)、R15(程序计数器PC)也在不断变化。
在这里插入图片描述

3.运行结果
在这里插入图片描述
在这里插入图片描述
调试结果与设置的值一致。

三、分析hex文件

1.build生成的 hex文件各段的大小
一个ARM程序包含3部分:RO,RW和ZI。RO是程序中的指令和常量;RW是程序中的已初始化变量;ZI是程序中的未初始化的变量。在这里插入图片描述2.hex文件格式
hex 文件是由一行行固定格式的文本所成的ASCII 文本文件,每一行包含一 个 hex 记录 。 这些记录由对应机器语言码和常量数据的十六进制编码数字组成。

基本格式::+aa+bbbb+cc+d…d+ee

每一组字母对应一个不同的域,每一个字母对应一个十六进 制编码的数字。每一 个域由至少由两个十六进制编码数字组 成,它们构成一 个字节 ,每个域的具体描述如下:
(1):一个记录的开头;
(2)aa:表示记录中数据字节(dd)的数量;
(3)bbbb:表示记录当中数据的起始地址;
(4)cc:表示hex记录的类型
00 – 数据记录
01 – 文件结束记录
02 – 扩展段地址记录
03 – 开始段地址记录
04 – 扩展线性地址记录:将该地址(0x0800<<16) 后
作为基地址,并且表示在下一个04类型行出现之前都要使用
该地址。
05 – 开始线性地址记录:函数的入口地址。

(5)dd:代表一个字节的数据,字节的数量与aa相对应;
(6)ee:表示校验和(校验和=0x100 - 累加和);
累加和:将记录中所有的十六进制编码数字对的绝对值相加,计算结果取低字节。

打开Objects,打开hex文件。
在这里插入图片描述在这里插入图片描述

以第一行为例:
02表示该记录中含有2个字节的数据,分别是0x08和0x00(地址信息)两个字节的数据。0000表示数据的起始地址为0000。04表示该行记录的是扩展线性地址,第二行数据要从0x08000000( (0x0800<<16) | 0x0000 )开始记录。,第3行则从 0x08000010 ( (0x0800<<16) | 0x0010 )开始记录。F2:表示校验和,256D-(02H+04H+08H)=F2H。

四、总结

通过对汇编程序的编写和调试,发现自己还是没有掌握调试的方法,以及对汇编语言的相关语法也不是很熟悉,后期要多多加强,但还是收获满满,感谢对我的文章给予帮助的大佬们。

五、参考文章

HEX文件格式详解
基于MDK创建纯汇编语言的STM32工程——汇编实现LED闪烁

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值