文章目录
要求
-
在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。
-
在上面Keil 汇编基础上,选择完成下列练习:
用汇编程序完成一个输出“Hello world”到串口的程序。
一、在Keil下完成一个汇编程序的编写
1、新建工程
打开Keil软件
点击菜单栏的Project
,点击选项New uVision Project
,创建新的工程
设置项目工程的路径和名称,并保存
2、配置环境
设置工程的目标环境
本文基于STM32F103 VET3
,因此在弹出的窗口选择相应的选项
选择运行环境
-
CMSIS
下选择CORE
; -
Device
下Startup
,其中包含了启动文件
添加源文件
鼠标右键单击Source Group 1
,选择Add New Item to Group...
选择 Asm File (.s)
,创建汇编文件;设置源文件的名称并保存
创建好后如下图
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
(2)仿真器设置
设置硬件仿真器为ST-LINK
,具体根据自己的实际情况进行选择
模式设置为JTAG
接口或者SW
(根据自己的实际情况进行选择)
勾选 Create HEX File
(3)编译调试
调试结果,寄存器R5,R6,R7,R8的值和程序设置一致
调试工具的用法:https://blog.csdn.net/ybhuangfugui/article/details/51706145
4、hex文件分析
(1)hex文件是什么
-
它是由一行行符合Intel HEX 文件格式的文本所构成的ASCII 文本文件。每一行包含一 个 HEX 记录,由对应机器语言码和/或常量数据的十六进制编码数字组成。
-
Hex文件通常用于传输将被存于ROM 或者EPROM 中的程序和数 据。大多数EPROM 编程器或模拟器使用Intel HEX文件。Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。
(2)hex文件的数据格式
Intel HEX 由任意数量的十六进制记录组成。每个记录包含5个域,每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节。
-
:(冒号) 每个Intel HEX 记录都由冒号开头
-
LL 是数据长度域, 它代表记录当中数据字节 (D…D) 的数量
-
aaaa 是地址域, 它代表记录当中数据的起始地址
-
TT是代表HEX 记录类型的域
-
D…D是数据域,它代表一个字节的数据。一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域(LL)中指定的数字相符
-
CC是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足
记录格式可表示为::[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和]
以下为实例分析
(3)hex文件各部分的大小
(4)hex文件前8个字节内容及含义
第一行为
020000040800F2
,实质表达式16进制数据0x02 0x00 0x00 0x04 0x08 0x00 0xf2
-
0x02
表示本行数据的长度 -
0x00
0x00
表示本行数据的起始地址 -
0x04
表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
‘01’ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
‘02’ Extended Segment Address Record: 用来标识扩展段地址的记录
‘03’ Start Segment Address Record:开始段地址记录
‘04’ Extended Linear Address Record: 用来标识扩展线性地址的记录
‘05’ Start Linear Address Record:开始线性地址记录
0x08
0x00
该行两个字节的数据
数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址0xf2
最后一个字节为校验和
校验和的算法为:计算
0x54
前所有16进制码的累加和(不计进位)
检验和 =0x100
- 累加和
二、用汇编程序完成一个输出“Hello world”到串口的程序
1、新建工程
重新再创建一个纯汇编语言的STM32工程 (跟上面的步骤一样),这次选择运行环境时,不用再勾选 “Startup” 和 “CORE”
2、实验代码
添加一个汇编文件,代码内容如下
;RCC寄存器地址映像
RCC_BASE EQU 0x40021000
RCC_CR EQU (RCC_BASE + 0x00)
RCC_CFGR EQU (RCC_BASE + 0x04