本文将在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。
四、总结
通过对汇编程序的编写和调试,发现自己还是没有掌握调试的方法,以及对汇编语言的相关语法也不是很熟悉,后期要多多加强,但还是收获满满,感谢对我的文章给予帮助的大佬们。