hex 格式意义解释

关键字 :hex

 一、概述

.hex 文件格式是一种能够烧写到单片机中,被单片机执行的文件格式。可以使用不同的编辑器将 C 或汇编源文件编译成 .hex 文件,如 IAR、KEIL 等。

然而,每次打开 .hex 文件,都一头雾水,除了本身的 .bin 内容以外,这多的各种数据都是代表啥意思?如果用 notepad 打开的话,它还会贴心地将不同类型的数据标成不同颜色,然而,挡不住看不懂啊。接下来就让我们来试着理解 .hex 格式数据的各种意义。


二、hex 文件格式

2.1 hex 基本格式


图1. hex 文件

hex 由任意数量的十六进制记录组成,每个记录包含 6 部分,分别为: MARK 、 RECLEN 、 OFFSET 、 RECTYP 、 DATA 、 CHKSUM 。

  • MARK :冒号( 1 Byte ), 每个 Intel HEX 记录都由冒号开头
  • RECLEN :本行数据长度( 1 Byte ),表示记录当中数据字节的数量
  • OFFSET :本行数据的起始地址( 2 Byte ),表示记录当中数据的起始地址
  • RECTYP :数据类型( 1 Byte ),可能是以下数据当中的一个:
    • 00 -- 数据记录
    • 01 -- 文件结束记录
    • 02 -- 扩展段地址记录
    • 03 -- 开始段地址记录
    • 04 -- 扩展线性地址记录
    • 05 -- 开始线性地址记录
  • DATA:数据( n Byte ),数据的字节数量与 RECLEN 指定的长度一致
  • CHKSUM :校验码( 1 Byte ),校验和,计算方法是将记录当中所有十六进制编码数字对的值相加,以 256 为模进行补足


2.2
数据类型解释


2.2.1
数据( 00 )


数据记录的格式为:“ : + RECLEN + OFFSET + 00 + DATA + CHKSUM ”, OFFSET 为数据的第一个字节的偏移地址,用于 hex 文件的数据记录。


图 2. 数据记录

如图 2,该 hex 文件的第 562 行数据记录的意义是:此行有 0x10 个数据;此行第一个数据的偏移地址为 0x2300 ;数据类型为 00 ,即数据记录;数据为 8DF80900E87A8DF80A00287B8DF80B00 ;此行校验为 0x1B。类似的,第 567 行数据记录的意义是:此行有 0x10 个数据;此行第一个数据的偏移地址为 0x2350 ;数据类型为 00 ,即数据记录;数据为 69616C5F706F72745F756172742E6300 ;此行校验为 0x77。


2.2.2
文件结束( 01 )

文件结束记录的格式为:“ : + 00 + 0000 + 01 + CHKSUM ”, 用于表示 hex 文件的结束。


图 3. 文件结束记录

如图 3,该 hex 文件的第 725 行表示该 hex 文件已结束。

2.2.3 扩展段地址( 02 )

扩展段地址记录的格式为:“ : + 02 + 0000 + 02 + USBA + CHKSUM ”, USBA ( Upper Segment Base Address ) 为该段的地址,用于记录 hex 文件的数据基地址。

2.2.4 开始段地址( 03 )

开始段地址记录的格式为:“ : + 04 + 0000 + 03 + CS / IP + CHKSUM ”, 对于80x86处理器,请指定CS / IP寄存器的初始内容(即起始执行地址),字节数始终为04,前两个数据字节是CS值,后两个是IP值,用于记录 hex 文件的起始执行地址。

2.2.5 扩展线性地址( 04 )

扩展线性地址记录的格式为:“ : + 02 + 0000 + 04 + ULBA + CHKSUM ”, 其字节数始终为0x02,两个数据字节(大字节序)为所有后续类型指定 32 位绝对地址的高 16 位记录,如果是数据类型 00 记录之前没有任何扩展线性地址类型 04 记录,则其高 16 位地址位默认为 0000 。


图 4. 扩展线性地址记录

如图 4,该 hex 文件的第 4098 行为扩展线性地址记录,意义是:此行后面的数据绝对地址的高 16bit 为 0x0001 ,比如第 4100 行数据的起始地址为 0x0001(高 16bit)+ 0x0010(低 16bit)=  0x0001 0010,第 4102 行数据的起始地址为  0x0001(高 16bit)+ 0x0030(低 16bit)=  0x0001 0030。



2.2.6 起始线性地址( 05 )

起始线性地址记录的格式为:“ : + 04 + 0000 + 05 + EIP + CHKSUM ”,  4 个数据字节代表一个32位地址值(big-endian),对于80386和更高版本的CPU,此地址将加载到EIP寄存器中。用于指定目标文件的执行开始地址。


图 5. 起始线性地址记录

如图 5,该 hex 文件的第 724 行为起始线性地址记录,意义是:此文件的执行起始地址为 0x0000 0401。

到这里对于 hex 的基本格式及其意义有了大概的了解,下次再看到 .hex 文件终于不至于一脸懵了哈哈哈哈。

 

 

三、参考资料

(1)LPC546XX 系列相关资料均可在 NXP 官网下载,网址如下:

https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc54000-cortex-m4-/power-efficient-microcontrollers-mcus-with-advanced-peripherals-based-on-arm-cortex-m4-core:LPC546XX?&tid=vanLPC546XX

(2) 博客《HEX文件格式详解》

https://blog.csdn.net/xsx669/article/details/83795274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161576774316780271572784%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161576774316780271572784&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-83795274.pc_search_result_before_js&utm_term=hex%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F

(3) 博客《hex文件格式总结》

https://blog.csdn.net/u010632165/article/details/103860399?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161576774316780271572784%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161576774316780271572784&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-103860399.pc_search_result_before_js&utm_term=hex%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能