• [转]HEX文件格式解析


    1.前言

    本文主要讲述keil MDK 下STM32编译生成的的HEX镜像文件格式。并说明镜像load地址是如何添加进HEX文件的。 

     2.keil MDK如何在HEX文件中添加load addr

     通过在keil mdk中进行如下的设置,则会将0x8019000的load addr加入到HEX文件中

    图 镜像配置

    3.HEX文件格式

    冒号 本行数据长度 本行数据起始地址 数据类型 数据 校验码
      1 byte 2 bytes 1 byte n byte 1 byte

     表 HEX文件格式

    • 以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)
    • 在HEX文件里面,每一行代表一个记录。记录的基本格式为如上表所示

    (1)第一个字节 表示本行数据的长度;

    (2)第二、三字节表示本行数据的起始地址;

    (3)第四字节表示数据类型,数据类型有: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:           开始线性地址记录

    (4)之后是数据

    (5)最后一个字节 为校验和。

    注:校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和

    3.HEX实例

    笔者说编译出的HEX文件内容如下:

    :020000040801F1
    :10900000E84D002039930108F5B30108F7B30108D2
    :10901000F9B30108FBB30108FDB30108000000002B
    :109020000000000000000000000000004D92010858
    :10903000FFB3010800000000D59201082593010844

    ....

    :00000001FF
    • 第一条语句:02 0000  04 0800  F2
    冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
      1 byte 2 bytes 1 byte n byte 1 byte
    02 0000 04 0801

     

    F1

     在上面的数据类型后2种记录(04,05)都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。

    以我们的语句为例:第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0801,校验和为F1。

    从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0801 << 16) = 0x0801 0000 ,后面的数据记录都以这个地址为基地址。

    •  第二条语句 :10900000E84D002039930108F5B30108F7B30108D2
    冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
      1 byte 2 bytes 1 byte n byte 1 byte
    : 10 9000 00 E84D002039930108F5B30108F7B30108 D2

    第2条记录的长度为10(0x10=16字节),LOAD OFFSET为0000,RECTYPE为00('00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录),数据为E84D002039930108F5B30108F7B30108 校验码为D2;

    此时基地址为:0x0801 0000  加上偏移地址:0x9000   这条记录的16个字节的数据的起始地址为:0x0801 0000+ 0x9000 =0x0801 9000

    • 第四条语句:00000001FF”  (每一个.hex文件的最后一行都是固定为这个内容)
    冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
      1 byte 2 bytes 1 byte n byte 1 byte
    : 00 0000 01   FF

     (每一个.hex文件的最后一行都是固定为这个内容)
    记录的长度为00,LOAD OFFSET为0000,RECTYPE为01  (01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾)

    4.参考文献

    [1] http://blog.csdn.net/yx_l128125/article/details/13624947

  • 相关阅读:
    hdu4535
    hdu4535
    hdu4503 概率
    hdu4503 概率
    hdu4499 搜索
    hdu4499 搜索
    hdu1146
    hdu1146
    Proj THUDBFuzz Paper Reading: Typestate-Guided Fuzzer for Discovering Use-after-Free Vulnerabilities
    Proj THUDBFuzz Paper Reading: Intriguer: Field-Level Constraint Solving for Hybrid Fuzzing
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/7267707.html
Copyright © 2020-2023  润新知