基于STM32的MDK软件编写汇编程序

要求

  • 在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。

  • 在上面Keil 汇编基础上,选择完成下列练习:
    用汇编程序完成一个输出“Hello world”到串口的程序。

一、在Keil下完成一个汇编程序的编写

1、新建工程

打开Keil软件
点击菜单栏的Project,点击选项New uVision Project,创建新的工程
在这里插入图片描述

设置项目工程的路径和名称,并保存
在这里插入图片描述

2、配置环境

设置工程的目标环境
本文基于STM32F103 VET3,因此在弹出的窗口选择相应的选项
在这里插入图片描述

选择运行环境

  • CMSIS下选择CORE

  • DeviceStartup,其中包含了启动文件

在这里插入图片描述
添加源文件
鼠标右键单击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

  1. 0x02
    表示本行数据的长度

  2. 0x00 0x00
    表示本行数据的起始地址

  3. 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:开始线性地址记录

  1. 0x08 0x00
    该行两个字节的数据
    数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址
  2. 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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值