×
单片机 > 单片机程序设计 > 详情

HEX文件格式分析 - 适用MPLAB

发布时间:2021-06-29 发布时间:
|

概要

.HEX文件是MPLAB生成的一种可执行文件的格式,它本身是由ASCII字符
组成的,但其包含16进制的可执行代码的信息,也就是说,这类文件描述
在程序存储器的哪个单元放入什么指令。

.HEX文件的种类

MPLAB可以生成3种不同格式的可执行文件。其中两种是.HEX文件,它们分别
称为INHX8M格式(Intel Hex Format)和INHX32格式(Intel Hex 32 Format);
另外一种称为INHX8S格式(Intel Split Hex Format),这种格式会同时
生成.HXL和.HXH文件,两个文件分别存放指令数据的低字节和高字节。

这里只讨论两种.HEX文件。MPLAB内嵌的连接器MPLINK在默认情况下生成INHX32
格式的.HEX文件,也可以使用/aINHX8M选项指定生成INHX8M格式的.HEX文件。

我们的烧写器应该能支持这两种格式的.HEX文件。

INHX32格式的.HEX文件

一个INHX32格式的.HEX文件是由若干个形式相同的行构成的。

行的种类

对于最多只有8K字程序空间的PIC16F87X单片机而言,相应的.HEX文件只有3种
不同的行:线性地址定位行,代码数据行,结尾标志行。一个.HEX文件的第1行
是一个线性地址定位行,后面接着是若干个代码数据行,最后一行是结尾标志
行。
线性地址定位行仅仅对超过32K字代码的程序有用。实际上,INHX32格式与
INHX8M格式的不同之处就在于它能表示超过32K字代码的程序。线性地址
定位行中指定指令存放地址的高16位,而低16位由代码数据行中的“AAAA”部分
指定。“AAAA”表示指令存放地址的2倍,所以最多能表示32K字的指令,而
PIC16F87X单片机最多只有8K字程序空间,故不需要用到指令地址的高16位,
因此.HEX文件的线性地址定位行指定的指令地址的
高16位总为“0000”。

代码数据行指定一段连续存放的代码的起始存放地址和代码值。通常一行中
最多有16条语句的代码。

结尾标志行标志整个文件的结束。

行的格式

一个INHX32格式的.HEX文件的每一行都是下面这种格式:
:BBAAAATTHHHH....HHHHCC
即开始是9个字符组成的前缀“:BBAAAATT”,加上若干个4字符的“HHHH”
数据,结尾是2个字符的校验字“CC”。这里所说的“字符”是指组成文件
的ASCII字符,而一个16进制“字节”必须用两个“字符”表示。
各个部分的意义是:
: 一行的开始符。
BB 数据部分的字节数,即“HHHH”部分的字节数。
AAAA 代码开始存放的地址的2倍。仅在代码数据行中有意义,在其余两种类型的
行中这一部分为“0000”。
TT 行的类型。
00 代码数据行
01 结尾标志行
02 段地址定位行(PIC16F87X单片机的.HEX文件中没有用到)
04 线性地址定位行
HHHH 在代码数据行中,表示一条14-bit的指令代码,其中低字节在前,高字节
在后,比如“movlw 0xaa”这条指令对应的代码是30AA,相应的HHHH表示为AA30;
在结尾标志行中,没有这一部分;在线性地址定位行中,这一部分为指令存放地
址的高16位。
CC 校验字。校验规则是,本行中前面所有的字节(两个字符)表示的16进制数
相加,再加上CC表示的16进制数,所得的和必须是256的整数倍,即用16进制表示
时末尾两位都为0。

示例

下面是一个简单的程序的汇编语句及对应的可执行代码。
地址 代码 汇编解析 源程序
------- ----- ----------- ---------------------
org 0x0000
000000 2810 GOTO 0x10 goto main
org 0x0004
000004 2818 GOTO 0x18 goto int_serv

org 0x0010
main
000010 1683 BSF 0x3,0x5 bsf STATUS, RP0
000011 1303 BCF 0x3,0x6 bcf STATUS, RP1
000012 0188 CLRF 0x8 clrf TRISD
000013 1283 BCF 0x3,0x5 bcf STATUS, RP0
000014 0188 CLRF 0x8 clrf PORTD
000015 160b BSF 0xb,0x4 bsf INTCON, INTE
000016 178b BSF 0xb,0x7 bsf INTCON, GIE
stop
000017 2817 GOTO 0x17 goto stop

int_serv
000018 30ff MOVLW 0xff movlw 0xff
000019 0088 MOVWF 0x8 movwf PORTD
00001a 0009 RETFIE retfie
END
它对应的INHX32格式的.HEX文件如下:
:020000040000FA (1)
:020000001028C6 (2)
:020008001828B6 (3)
:04000A00003400348A (4)
:10002000831603138801831288010B168B17172878 (5)
:06003000FF30880009000A (6)
:00000001FF (7)
第(1)行是线性地址定位行。第(2)行至第(6)行是代码数据行。
第(7)行是结尾标志行。

INHX8M格式的.HEX文件

对PIC16F87X单片机而言,INHX8M格式的.HEX文件与INHX32格式的.HEX文件
只有一点不同,就是INHX8M格式的.HEX文件没有线性地址定位行。以下是
上一节所示的源程序对应的INHX8M格式的.HEX文件。
:020000001028C6 (1)
:020008001828B6 (2)
:04000A00003400348A (3)
:10002000831603138801831288010B168B17172878 (4)
:06003000FF30880009000A (5)
:00000001FF (6)
可见这个文件就是前面INHX32格式的.HEX文件的(2)至(7)行。本文件中的
(1)至(5)行是代码数据行,第(6)行是结尾标志行。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些