首页 > 编程知识 正文

keil怎么编程生成hex文件,keil5汇编语言文件后缀

时间:2023-05-06 05:07:40 阅读:167013 作者:1563

目录

一. Keil uVision5环境下汇编程序编写

1、新建工程

2、添加源文件

二.代码编译运行

1、代码编译

2、代码调试

三.分析生成的HEX文件

1、扩展线性地址记录

2、数据部分

3、文件末尾

四.总结

五.参考资料

一. Keil uVision5环境下汇编程序编制1、新建项目

打开Keil uVision5,单击“项目”,然后单击“新建uvision项目……

弹出窗口如下所示。 首先设置新项目的路径。 (我这里存放在D盘的文件夹里);

再设置一个项目名称,设置" TEXT ",然后单击“保存”即可。

然后选择项目的目标环境。 我在这里选择了“STM32F103C8”。 具体流程如下。 进行选择后请单击“确定”。

选择运行环境:

1、在CMSIS中选择酷睿;

2、在Device下启动,其中包含启动文件;

完成选择后请单击“确定”;

2、添加源文件

右键单击Source Group 1,然后选择addnewitemtogroup ' source group1'…。

选择文件类型“ASMfile(.s )”以创建汇编文件;

将文件名称为“TEXT”,点击“Add”即可;

将源代码添加到文件中。 具体代码如下。

AREA MYDATA,DATA AREA MYCODE,codeentryexport _ _ main _ _ main mov r0,#10MOV R1,#11MOV R2,#12MOV R3,#13; LDR R0,=func01BLfunc01; LDR R1,=func02BLfunc02BL func03LDR LR,=func01LDR PC,=func03B .func01MOV R5,#05BX LRfunc02MOV R6,#06BX LRfunc03MOV R7,

OV R8, #08BX LR

 具体如下:

 二、代码的编译运行

1、代码的编译

由于所做的是仿真实验,所以需要对编译环境进行一些初始设置,具体如下:

Ⅰ. 点击魔法棒图标——“Options for Target…” ;

 Ⅱ. 在Output界面下,选择“Create HEX File”,即可在编译运行结束后生成HEX文件;

Ⅲ. 不关闭此窗口,继续点击到”Debug“界面下, 先选择“Use Simulator”,表示使用软件仿真;再选择“Run to main()”则表示跳过汇编代码,直接跳转到main函数开始仿真;之后设置下面的 “Dialog DLL”幸福的冬瓜“DARMSTM.DLL”和“TARMSTM.DLL”,“parameter”幸福的冬瓜“-pSTM32F103C8”,用于设置支持STM32F103C8的软硬件仿真(PS:我这里使用的是STM32F103C8,“parameter”项的设计根据你选择的型号而定);

Ⅳ. 点击“Rebuild”进行编译;

编译后如下图所示,没有错误,可进行调试;

 2、 代码调试

点击以下图标进入调试阶段:

在调试前地址如下图:

 接下来开始单步调试运行,点击如下图标进行运行,停止后发现寄存器R0,R1,R2,R3,R5,R6,R7,R8的值与代码所设一致;

 三、分析生成的HEX文件

先在你保存此工程的文件夹里找到HEX文件,并以记事本的形式打开这个文件,如下图所示:

 打开后即得到如下:

 

1、扩展线性地址记录

扩展线性地址记录,HEX 文件的第一排十六进制也叫作 32 位地址记录或 HEX386 记录

这些记录包含数据地址的高 16 位,本工程的HEX文件的第一排地址记录为:020000040800F2

 具体分析如下:

内容分析j02这个记录当中数据字节的数量0000    地址域,对于扩展线性地址记录,这个域总是 000004 记录类型 04 (扩展线性地址记录)0800 是地址的高 16 位F2  是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h)

 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录;

线性地址保持有效,直到它被另外一个扩展地址记录所改变;

通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址;

2、 数据部分

Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd...]cc

每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字

每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

具体如下:

内容分析: 每个Intel HEX记录都由冒号开头ll  数据长度域,它代表记录当中数据字节(dd)的数量aaaa  地址域,它代表记录当中数据的起始地址tt  代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线性地址记录)dd 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符cc   校验和域,它表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足)

Intel HEX文件由任意数量以回车换行符结束的数据记录组成

3、 文件尾

在文件的最后一排,是一个文件的结束标志::00000001FF

:00000001FF00记录的长度为 00000LOAD OFFSET为000001TYPE = 01FF校验和为FF

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

四、总结

通过本实验的完成,对于Keil的使用和对STM32的仿真更加熟悉,在进行仿真之前,一定要对仿真环境的初始值设置妥当,否则会对调试造成一定的影响;对于HEX文件内容的分析,详细请看参考,如有不当之处,请提出。

五、参考资料 1、ARM汇编基础之基于MDK创建纯汇编语言的STM32工程_GREYWALL-CSDN博客 2、基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容_ssj925319的博客-CSDN博客

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。