深入理解工具链-Hex文件详解

深入理解工具链-Hex文件详解

一、HEX文件格式说明

Hex文件是Intel公司提出的按地址排列的数据信息格式,数据宽度为字节,所有数据使用16进制数字表示,并且以ASCII码的形式,按行记录数据,下图为某工程代码的HEX文件局部截图:

如上图所示,HEX文件每一行均以“:”开头,表明记录的开始,“:”之后,每至少2个字符表示一组16进制数据,格式形如:BBAAAATTHHHH....HHHCC。

BB -- 16进制,表示此行数据长度字节数,即:HH的数目AAAA -- 16进制,表示数据记录的地址,根据类型不同有可能是基地址、段地址或偏移地址。TT -- 16进制,表示记录类型。00-代表本行是数据记录、01-代表HEX文件结束、02-标识扩展段地址记录,表明后面所有数据地址需要加上段地址左移4位、03-开始段地址记录:开始段地址记录,大部分Hex中不使用该记录类型,网上关于该记录类型的描述很少,具体作用不详、04-标识扩展线性地址记录,表明后面所有数据地址+线性地址左移16位,将该地址左移16 位后作为基地址,并且表示在下一个04类型行出现之前都要使用该地址作为基地址。05-开始线性地址记录:开始线性地址记录,即:程序入口地址(程序入口地址未必是main函数地址)。HH...HH -- 16进制数据,字节顺序根据芯片大小端和字长决定,处理器若为大端存储,高字节在前,低字节在后(如NXP的5744P),小端存储,则低字节在前,高字节在后(如STM32)。CC -- 16进制,校验码,除冒号和自身以外的其他字节数据加起来模除256的余数的补码,如上图第一行,其校验码为01 + ~(02+00+00+04+01+00)= F9。具体计算过程为:(02+00+00+04+01+00)加和为0x07,模除256后,商0余0x07,0x07补码为0xF9。

二、HEX记录类型详解

记录类型:0x00,数据标识

记录类型:0x01,本行为文件结束标识

记录类型:0x02,扩展段地址标识

记录类型:0x03,起始段地址标识

记录类型:0x04,扩展线性地址标识

记录类型:0x05,起始线性地址记录标识

一旦出现段地址或者线性地址,之后所有数据都要加偏移地址,直到出现一个新的段地址或者线性地址,再重新变更偏移地址。数据物理地址为:线性地址左移16位+段地址左移4位+偏移地址。

地址计算示例:

:020000040108EA 线性偏移地址:0x0108

:0401000090FFAA5502 数据地址:0x0100

基地址:0108左移16位,0x01080000;数据偏移地址:0x0100;实际物理地址=基地址+扩展段地址+偏移地址=0x01080100。

因此示例所表示的4个字节数据,在大端存储的处理器内存中的表示如下表所示:

内存地址数据0x010801000x900x010801010xFF0x010801020xAA0x010801030x55

三、文件结束与程序入口地址

上图示例为某工程HEX文件的末尾内容,其中包含了三种记录类型:00、01、05,其中:

00代表数据记录,其后的数据一般直接存放在芯片flash中。01代表HEX文件结束,其后不跟数据,仅包含校验和。05代表程序入口地址,其数据域的内容在本例中为0x01010400,该地址通常为MCU的复位向量地址,该地址在编译时由工程的链接脚本决定。

本文是作者闲时业余记录,如由遗漏错误,请见谅,感谢观看文章,转载不用注明出处。

上一篇: Java:方法的重载
下一篇: 梅西的世界杯漫画:从天才少年到传奇球王的励志故事

相关文章

聘才猫是什么?
【英语单词】彻底解释“valentine”! 含义、用法、例句、如何记忆
甲硝唑便宜又有效,陰道炎牙疼胃病都能用?醫生:4種情況可考慮
研究发现:饿一饿,对身体好处居然这么多(不只是瘦
康熙皇帝为何在承德修建避暑山庄,真实目的不仅仅是为了避暑
有哪些银行是不需要收年费的 ?