Terry 发表于 2016-5-27 14:52:47

HEX和BIN文件的区别

hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

  Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,真个文件以行为单位,每行以冒号开头,内容全部为16进制码。Hex文件可以按照如下的方式进行拆分来分析其中的内容:
  例如:
  :020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA
  第一个 0x02 为数据长度。
  紧跟着后面的0x00 0x00 为地址。
  再后面的0x04为数据类型,类型共分以下几类:
  '00' Data Record
  '01' End of File Record
  '02' Extended Segment Address Record
  '03' Start Segment Address Record
  '04' Extended Linear Address Record
  '05' Start Linear Address Record
  然后,接着0x04后面的两个 0x00 0x00就是数据。最后一个0xFA是校验码。
  HEX文件的每一行都是这样的格式:Intel hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下:

:CCAAAARR...ZZ

其中:
CC
本条记录中的数据字节数

AAAA
本条记录中的数据在存储区中的起始地址

RR
记录类型:
00 数据记录 (data record)
01 结束记录 (end record)
02 段记录 (paragraph record)
03 转移地址记录 (transfer address record)

...
数据域

ZZ
数据域校验和

Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。


而Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"顺序格式"按assembly code顺序翻译成binary machine code.由于分析出来Hex文件中的数据域ASCII码表示的十六进制与二进制一一对应,而且我公司DSP又是16位的,以一个word为最小单位,所以四个十六进制ASCII码代表一条机器指令单位或者地址.借于上面分析,编写了工具代码.大体原理是用fscanf函数在每行的数据域读入四个ASCII码,以短整形(short int 16bit)形式储存,在把这个短整形变量顺序fwrite到文件流中去即可.

举一例说明:
表1
ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;设堆栈
LOOP:
NOP
LJMP LOOP ;循环
END ;结束
表2
:03000000020040BB
:0700400075815F000200431F
表3         
02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43
表1为源程序,表2是汇编后得到的HEX文件,表3是由HEX文件转换成的目标文件,也就是最终写入EPROM的文件,它由编程器转换得到,也可以由HEXBIN一类的程序转换得到。学过手工汇编者应当不难找出表3与表1的一一对应关系,值得注意的是从02 00 40后开始的一长串‘FF’,直到75 81,这是由于伪指令:ORG 040H造成的结果。摘自:http://blog.csdn.net/yezhubenyue/article/details/7742575
页: [1]
查看完整版本: HEX和BIN文件的区别