.hex文件格式,hex文件不能生成
十六进制文件格式摘要
什么是十六进制文件?
十六进制是英特尔制定的文件格式标准。hex一般是一个文本文件,在微控制器的固件开发中经常可以看到。比如基于STM32F103用MDK进行硬件开发,软件可以生成十六进制文件;如下图所示;
这是一个简单的STM32标准外设库项目,在代码中不做任何事情。如下所示:
#include stm32f10x.h
#包括
//*
* @ brief主程序。
* @param None
* @retval None
*/
作废)。
{
/*在此添加您的应用程序代码
*/
/*无限循环*/
while(1).
{
}
}
最后打开生成的十六进制文件,发现确实是文本文件,所以只要写软件不能把十六进制文件转换成bmdgk文件再写,我就直接把十六进制文件写到单片机的Flash里。
:0200000040800f2
:10000000000400204901000890100010000000100000083 a
:1000100097010008910100008810008810008810008810000001 b
:10002000000000000000000000000000000000009d 010000000000000 a
:10003000930100080000009 b 0100008290200084d
:100040006301000863010008630100086301000800
:1000500063010008630100008630100008630100008630100008630100008630100008630100008 f 0
:100060063010008630100010001000863010000863010008630100086301000863010000808 e 0
:10007000630100086301000863010000863010008630100086301000863010000008 d0
:10008006301000863010001000100086300008630100008000002 c
:10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
:1000 a 0006301000863010000863010000863010000863010008630100086301000808 a 0
:1000 b 0006301000863010000863010000863010000863010008630100086301000863010000890
:1000 c 0006301000863010000863010000863010000863010008630100086301000800
:1000d 0006301000863010000863010000863010000863010000863010000863010000870
:1000 e 0006301000863010000863010000863010000863010000863010000860
:1000 f 000630100086301000800080000000000028
:100100000000000000000000630100086301000817
:1001100063010008630100086301000086301000863010008630100086301000802 f
:100120006301000863010000863010000863010000863010008630100086301000081 f
:1001300063010008 dff 80 CD 000 f 018 f 80048004711
:10014000 a 10200080004002006488047064800480048004800480048004800480044
:10015000费7费7费7费7费7费7费7费7费7费777
:10016000费72d 02000835010008064 c 074 DAA
:1001700006 e0e 06840 f 0010394 e 807009847103477
:10018000 AC 42 F6 D3 fff 7 daffa 4020008 b 40200087d
:10019000费77047费770477047704770470000 d 4
:1001 a 0000 CB 500211 f 4801910091026842 f 4803291
:1001 b 0002604 ff4a 063026802 f 400320092019 ad 8
:1001 c 000521 c 0192009 a 12 b 9019 a9 a42 f3d 1026824
:1001d 000920324d 5012100914168416041684168416841604 a
:1001 e 00041684160416821 f47 c 114160416841 f4fb
:1001 f 00098114160016841 f 080710160016001688901d 6
:10020000 fcd 5416821 f 003014160416841 f 0
0201E1
:1002100041604168 c1f 381010229 fad 10 CBD 00910 e
:100220000 CBD 00000010024070470000104810 b5df
:100230000016841 f 00101016041680 e4a 11404160 ce
:1002400001680 D4 a 11400160016821 f 480210160 BC
:10025000416821 F4 Fe 0141604 ff 41f 0181600021 db
:10026000 c 162 fff 79 dff 05494 ff 00060086010 BDB 7
:1002700000010024000000 fff 8 fffff 6 Fe 08 ed 00 e 06 e
:10028000 fee 702 e 008 c 8121 f 08 c 1002 afad 1704731
:100290007047002001 e001c 1121 f 002 afbd 1704706
:1002 a 000 fee 70000 b 402000800000200004000087
:0402B00092020008AE
:0400000508000135B9
:00000001FF
存储形式
从上面的文件中不难发现,hex文件的每一行都由:作为起始代码,这是显而易见的,而后面这些乱七八糟的数据又代表了什么?先看下图;
类似于这种通用的通信协议,一帧数据往往包括起始码、数据长度、数据类型、数据、校验码等。所以十六进制文件也不例外。这里它包含了几个特性,下面指的是wiki;
起始码:每一行数据作为一帧,用:作为起始码;
长度:两位十六进制数(一对十六进制数),表示数据字段的字节数(一对十六进制数)。最大字节数为255(0xFF)。6 (0x10)和32(0x20)是常用字节;
地址:四个十六进制数字,代表数据的16位起始内存地址偏移量。数据的物理地址通过将该偏移量与之前建立的基址相加来计算,因此允许存储器寻址超过16位地址的64 KB限制。默认情况下,基址为零,可以通过各种类型的记录进行更改。基址和地址偏移量始终表示为大端值。
指令类型:两个十六进制数字00到05,定义该行数据的具体含义;
数据:N字节数据序列,用2 N个十六进制数字表示;
校验码:(两位十六进制数字),可以用来验证记录中没有错误的计算值;
命令类型(记录类型)
记录类型的值一般为00~05,以十六进制格式表示当前数据的含义:
十六进制代码
留档活字
例子
00
数据
包含数据和数据的16位起始地址。字节计数指定记录中的数据字节数。右边显示的例子是0B(十一)个数据字节(61、64、64、72、65、73、73、20、67、61、70)位于以地址开始的连续地址0010处。
:0b 0010006164647265737320676170 a7
01
电渗流
每个文件必须在文件的最后一行出现一次。数据字段为空(因此字节数为00),地址字段通常为0000。
:00000001FF
02
扩展段地址
数据字段包含一个16位段基址(因此字节数始终为02),并且与80x86实模式寻址兼容。地址字段(通常为0000)被忽略。最新的段地址02记录乘以16,然后加到每个后续的数据记录地址上,形成数据的物理起始地址。这允许寻址高达1 MB的地址空间。
:020000021200个
03
起始段地址
对于80x86处理器,请指定CS: IP寄存器的初始内容(即起始执行地址)。地址为0000,字节数始终为04,前两个数据字节为CS值,后两个为IP值。
:0400000300003800C1
04
扩展线性地址
允许32位寻址(最高4gb)。记录的地址字段将被忽略(通常为0000),其字节数始终为02。两个数据字节(big endian)为所有后续类型指定32位绝对地址的高16位00记录;这些高位地址位适用于下一个04记录。通过组合高16位的最新地址位来形成记录04,类型为00的绝对地址与低16位的地址记录00一起被记录。如果是00型记录,则之前没有04型记录,然后其高16位地址位默认为0000。
:02000004FFFFFC
05
起始地址
地址字段为0000(未使用),字节数始终为04。四个数据字节代表一个32位地址值(大端)。对于80386和以后的CPU,这个地址将被载入EIP寄存器。
:0400000508000135B9
校验和
最后一个字节代表除起始码以外的其他字节的校验和,下面简单介绍一下它的计算方法,这里比较直观。
对前面的十六进制做了一些简单的处理,以便以后分析:
:02 0000 04 0800 F2
:10 0000 00 00040020490100089901000895010008 3A
:10 0010 00 9701000891010008810200080000000 1B
:10 0020 00 00000000000000000000000009d 010008 2A
:10 0030 00 9301000800000009 b 01000829020008 4D
:10 0040 00 63010008630100086301000863010008 00
:10 0050 00 63010008630100086301000863010008 F0
:10 0060 00 63010008630100086301000863010008 E0
:10 0070 00 63010008630100086301000863010008 D0
:10 0080 00 63010008630100086301000800000000 2C
:10 0090 00 000000000000000000000000063010008 F4
:10 00a 0 00 63010008630100086301000863010008 A0
:10 00 B0 00 6301000863010008630100086301000863010008 90
:10 00c 0 00 6301000863010008630100086301000863010008 80
:10 00d 0 00 6301000863010008630100086301000863010008 70
:10 00 E0 00 6301000863010008630100086301000863010008 60
:10 00f 0 00 63010008630100080000000000000000 28
:10 0100 00 00000000000000006301000863010008 17
:10 0110 00 63010008630100086301000863010008 2F
:10 0120 00 6301000863010008630100086301000863010008 1F
:10 0130 00 63010008 dff 80 CD 000 f 018 f 800480047 11
字体10 0140 00 a 1020008000400200648804706480047 36
:10 0150 00英尺七英尺七英尺七英尺七英尺七英尺七英尺七英尺7 7
:10 0160 00 7费用72d 02000835010008064 c 074d AA
:10 0170 00 06 E0 06840 f 0010394 e 8070098471034 77
:10 0180 00 AC 42 f 6 D3 fff 7 daffa 4020008 b 4020008 7D
字体D4
:10 01a 0 00 0cb 500211 f 4801910091026842 f 48032 91
:10 01b 00 00 02 604 ff4a 063026802 f 400320092019 a D8
:10 01c 0 00 521 c 0192009 a12b 9019 a9 a42 F3 d 10268 24
:10 01d 0 00 920324d 5012100914168416041684160 4A
:10 01e 0 00 41684160416821 f47c 114160416841 F4 FB
:10 01f 000 98114160016841 D6
:E1
:10 0210 00 41604168 C1 f 381010229 fad 10 CBD 0091 0E
:10 0220 00 0 CBD 00000010024070470000104810 b5 DF
:10 0230 00 016841 E4
:公元前D4 a 1140016001680 f 480210160
:10 0250 00 416821 F4
:10 0260 00 c 162 fff 79 dff 05494 ff 00060086010 BD B7
:10 0270 00 0010024000000 fff 8 fffff 6 Fe 08 ed 00 e 06 e
:10 0280 00费702 e 008 c 8121 f 08 c 1002 afad 17047 31
:10 0290 00 7047002001 e001c 1121 f 002 afbd 17047 06
:10 02a 0 00费用70000 b4020008000002000040000 87
:04 02B0 00 92020008 AE
:04 0000 05 08000135 B9
:00 0000 01 FF
这里取最后三条指令,做一下检查;
:04 02B0 00 92020008 AE
:04 0000 05 08000135 B9
:00 0000 01 FF
:04 02B0 00 92020008 AE
0x040x020xB00x920x020x08=0x152
~0x52 1=0xAE
~按位取反
:04 0000 05 08000135 B9
0x040x050x800x010x35=0X47
~0x47 1=0XB9
~按位取反
:00 0000 01 FF
~0x01 1=0xFF
~按位取反
十六进制转bmdgk文件
资深调包侠找到一个可以使用的包;
点安装英特尔公司
根据示例,将foo.hex的内容转换为foo.bmdgk,地址从0转换为FF:
$ python hex 2 BMD GK。py-r 0000:00FF foo。十六进制
或(等效):
$ python hex 2 BMD GK。py-r 0000:-s 256 foo。十六进制