hex格式文件学习笔记
HEX格式
HEX文件格式学习笔记为了编写一个可以按照自己的要求进行ISP的程序,大概学习了一下HEX文件格式。
把学习笔记写出来,以为重新巩固所学习内容。
HEX文件以行为单位。
每行以字符‘:’ (0x3a)开头,以回车换行符0x0d, 0x0a为结束。
每行开始和结束之间的所有内容,都是以字符形式表现的。
例如数据如果是 0x1A ,那么转换到HEX格式的行里面就是0x31 0x41。
如果数据是16bit的,例如地址,则先显示高位,后显示底位。
例如 0x1234,转换成HEX格式文件后变成 0x31 0x32 0x33 0x34,显示出来以后就是1234。
将数据部分内容每2个字符看做一个HEX数据,例如::020*********FA , 我把它看做 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文件的每一行都是这样的格式:在例如::1000000018F09FE518F09FE518F09FE518F09FE5C0安装上面的数据行格式分析如下:每行中的数据并不是一定有的,第二个直接的数据长度为0,那么这行就没有数据。
由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存更大数据地址数据,就有了Extended Linear Address Record。
HEX文件和BIN文件格式的区别
HEX⽂件和BIN⽂件格式的区别在单⽚机开发中HEX⽂件和BIN⽂件是⾮常常见的烧写⽂件格式,以常⽤开发环境Keil为例,分别创建HEX和BIN⽂件,⽐如:1、创建HEX:在Keil⾥⾯可以通过勾选【魔法棒>Output>Creat HEX File】让⼯程输出HEX⽂件。
2、创建BIN:在Keil中在【魔法棒>User>After Build/Rebuild】标签下勾选Run #1,同时在其对应的User Command ⽂本框中输⼊fromelf --bin --output=@L.bin !L编译后就会输出BIN⽂件。
⾔归正传,先简单描述下HEX(左边)和BIN(右边)⽂件的区别:1、HEX⽂件HEX⽂件中同时包含的数据和地址信息,所以在烧写或下载HEX⽂件的时候,⼀般都不需要⽤户指定地址。
2、BIN⽂件BIN⽂件只有纯粹的数据(代码)信息,并不包含地址,所以烧写BIN时就需要指定烧写地址,⼀般可以在烧写⼯具上修改。
下⾯看⼀个Keil下⽣成的HEX和BIN⽂件的部分代码:HEX⽂件内容都是ASCII编码得到的,可以⽤本本编辑器直接打开,BIN⽂件不能⽤编辑器直接查看,可以把它转换成16进制然后显⽰(如在notepad++下装⼀个插件就好:):很直观的可以看到BIN⽂件只是HEX⽂件中的数据区域。
HEX格式解读: HEX⽂件每⼀⾏代表⼀个记录(RECORD),其基本格式如下 RECORD MARK 冒号(:) 表⽰起始标志 LOAD RECLEN 数据长度 即INFO or DATA 段的数据长度 OFFSET 地址偏移 指定相对基地址的偏移量 RECTYP 记录类型 记录类型:“00”数据记录 “01”⽂件结束记录 '02'扩展段地址记录 '03'起始段地址记录 '04'扩展线性地址记录 '05'开始线性地址记录 INFO or DATA 数据信息 校验值⾸先要注意的时,1-byte中的byte在HEX⽂件中因为经过ASCII编码的所以⽤两个字符表⽰⼀个16进制即⼀个字节,,在BIN⽂件中则是直接⽤⼀个字节表⽰这两字符,上⾯的图很直观下⾯以HEX⽂件第⼀⾏为例,它的含义主要有,02表⽰数据段“6000”长度为2,0000表⽰偏移地址,04表⽰记录类型为扩展线性地址的记录,6000表⽰线性地址的基地址并且表⽰的时[16-31]区域即⾼位地址,[0-15]区域即低位默认为0。
基础知识hex文件格式详解
基础知识hex文件格式详解hex文件格式总结•什么是hex文件?•文件格式•指令类型(Record type)•校验和o:04 02B0 00 92020008 AEo:04 0000 05 08000135 B9o:00 0000 01 FF•hex转bin文件什么是hex文件?hex是用于文件格式是intel规定的标准,总体来说,hex是文本文件,经常在微控制器的固件开发中看到hex的身影,例如基于STM32F103硬件,使用MDK开发的话,该软件就可以生成hex文件;如下图所示;这是一个简单的STM32标准外设库工程,代码里什么都没做,具体如下;#include 'stm32f10x.h'#include <stdio.h>/*** @brief Main program.* @param None* @retval None*/int main(void){/* Add your application code here*//* Infinite loop */while (1){}}最终,我们打开生成的hex文件,可以看到,这的确是一个文本文件,所以,直接将hex文件烧入MCU的Flash还是不行的,除非烧录软件可以把hex文件转成bin文件,然后再进行烧录;:020*********F2:10000000000400204901000899010008950100083A:10001000970100089101000881020008000000001B:100020000000000000000000000000009D0100082A:1000300093010008000000009B010008290200084D:100040006301000863010008630100086301000800:1000500063010008630100086301000863010008F0:1000600063010008630100086301000863010008E0:1000700063010008630100086301000863010008D0:10008000630100086301000863010008000000002C:1000900000000000000000000000000063010008F4:1000A00063010008630100086301000863010008A0:1000B0006301000863010008630100086301000890:1000C0006301000863010008630100086301000880:1000D0006301000863010008630100086301000870 :1000E0006301000863010008630100086301000860 :1000F0006301000863010008000000000000000028 :100100000000000000000000630100086301000817 :10011000630100086301000863010008630100082F :10012000630100086301000863010008630100081F :1001300063010008DFF80CD000F018F80048004711 :10014000A102000800040020064880470648004736 :10015000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777:10016000FEE7FEE72D02000835010008064C074DAA :1001700006E0E06840F0010394E807009847103477 :10018000AC42F6D3FFF7DAFFA4020008B40200087D :10019000FEE77047FEE7FEE77047704770470000D4 :1001A0000CB500211F4801910091026842F4803291 :1001B00002604FF4A063026802F400320092019AD8 :1001C000521C0192009A12B9019A9A42F3D1026824 :1001D000920324D50121009141684160416841604A :1001E00041684160416821F47C114160416841F4FB :1001F00098114160016841F08071016001688901D6 :10020000FCD5416821F003014160416841F00201E1 :1002100041604168C1F381010229FAD10CBD00910E :100220000CBD00000010024070470000104810B5DF :10023000016841F00101016041680E4A11404160CE :1002400001680D4A11400160016821F480210160BC :10025000416821F4FE0141604FF41F0181600021DB :10026000C162FFF79DFF05494FF00060086010BDB7 :10027000001002400000FFF8FFFFF6FE08ED00E06E :10028000FEE702E008C8121F08C1002AFAD1704731 :100290007047002001E001C1121F002AFBD1704706 :1002A000FEE70000B4020008000000200004000087:0402B00092020008AE:0400000508000135B9:00000001FF文件格式通过上面的文件,我们不难发现,hex文件每行都由:作为起始码,这是显而易见的,而后面这些乱七八糟的数据又代表什么呢?先看下面这张图;hexformat这个和一般的通讯协议类似,一帧数据往往包括起始码,数据长度,数据类型,数据,校验码等等,所以hex文件也不例外,这里它包含几个特点,下面参考了wiki;•起始码:每行数据作为一帧,并由:作为起始码;•字节长度:两个十六进制数字(一对十六进制数字),指示数据字段中的字节数(十六进制数字对)。
单片机烧录用的hex文件,文件格式解析(转载)
单⽚机烧录⽤的hex⽂件,⽂件格式解析(转载)含有单⽚机的电⼦产品在量产的时候会⽤到.hex⽂件或者.bin。
hex是⼗六进制的,包含地址信息和数据信息,⽽bin⽂件是⼆进制的,只有数据⽽不包含地址。
任何⽂件都有⼀定的格式规范,hex⽂件同样具有完整的格式规范。
今天和⼤家分享⼀下,hex是如何解析的。
⼀、hex⽂件解析hex⽂件可以通过UltraEdit、Notepad++、记事本等⼯具打开,⽤Notepad++打开之后会看到如下数据内容。
使⽤Notepad++打开后会不同含义的数据其颜⾊不同。
每⾏数据都会有⼀个冒号开始,后⾯的数据由:数据长度、地址、标识符、有效数据、校验数据等构成。
以上图的第⼀⾏为例,进⾏解析:第1个字节10,表⽰该⾏具有0x10个数据,即16个字节的数据;第2、3个字节C000,表⽰该⾏的起始地址为0xC000;第4个字节00,表⽰该⾏记录的是数据;第5-20个字节,表⽰的是有效数据;第21个字节73,表⽰前⾯数据的校验数据,校验⽅法:0x100-前⾯字节累加和;其中,第4个字节具有5种类型:00-05,含义如下:字段含义00表⽰后⾯记录的是数据01表⽰⽂件结束02表⽰扩展段地址03表⽰开始段地址04表⽰扩展线性地址05表⽰开始线性地址单⽚机的hex⽂件以00居多,都⽤来表⽰数据。
hex⽂件的结束部分如下图所⽰。
最后⼀⾏的01表⽰⽂件结束了,最后的FF表⽰校验数据,由0x100-0x01=0xFF得来。
⼆、扩展地址细⼼的同学可能发现了,上⾯的地址都是两个字节,范围从0x000-0xFFFF,如果地址是0x17FFFF该怎么办呢?这就要⽤到扩展字段了,举例如下:第⼀⾏中,第⼀个字节为0x02,表⽰只有两个字节的数据,⽽扩展段的标识符为0x04表⽰后⾯的数据0x0800为扩展线性地址,基地址的计算⽅法为:(0x0800<<16)=0x08000000,在0x04标识段出现之前,下⾯的数据都是这个基地址。
HEX文件详细介绍
02 是这个记录当中数据字节的数量。
0000 是地址域,对于扩展线性地址记录,这个域总是0000。
04 是记录类型 04(扩展线性地址记录)
FFFF 是地址的高16位。
FC 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。段地址保持有效,直到它被另外一个扩展地址记录所改变。
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址。
以下的例子演示了这个过程
[编辑本段]数据记录
Intel HEX文件由任意数量以回车换行符结束的数据记录组成。数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中数据字节的数量。
2462 是数据将被下载到存储器当中的地址。
: 每个Intel HEX记录都由冒号开头.
ll 是数据长度域,它代表记录当中数据字节(dd)的数量。
aaaa 是地址域,它代表记录当中数据的起始地址。
tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 – 数据记录
01 – 文件结束记录
02 – 扩展段地址记录
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。线性地址保持有效,直到它被另外一个扩展地址记录所改变。
十六进制文件格式
十六进制文件格式HEX格式内容含义HEX文件格式是我们经常遇到的一种文件格式,因为几乎所有的编程烧录文件都为HEX格式。
首先,HEX文件中是包含了地址信息的。
这和BIN文件不同,BIN文件中只包含了数据信息。
所以我们在烧写或者下载HEX文件的时候,一般不需要我们指定地址,但是在烧写BIN 文件的时候,用户是一定要指定地址信息的。
二、HEX文件都是由记录组成的。
它的每一行都是一个记录来的。
它是由任意数量的十六进制数组成。
每个记录包含五个域,它们以以下格式排列的::aabbbbcc[dd…]ee上面每一组不同的字母代表不同的一个域,每个字母代表一个十六进制的数字,每一个域至少由两个十六进制编码数字组成,每两个十六进制编码数字组成一个字节。
具体描述如下:1、每个HEX记录都由冒号开头;2、aa表示这个记录中的数据长度域,它代表记录当中数据字节[dd…]的字节数量。
3、bbbb是地址域,它代表记录当中数据的起始地址。
4、cc 是代表HEX记录类型的域,它可能是以下数据当中的一个:00 –数据记录01 –文件结束记录02 –扩展段地址记录04 –扩展线性地址记录5、dd 是数据域,它代表一个字节的数据,一个记录可以有许多数据字节。
记录当中数据字节的数量必须和数据长度域(aa)中指定的数字相符。
6、ee 是校验和域,它表示这个记录的校验和。
校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
比如:前面AduC7026的LED实验中的HEX文件内容为::020*********F2 。
1:1000000018F09FE518F09FE518F09FE518F09FE5C0 。
2:1000100018F09FE50000A0E118F09FE518F09FE5BB:100020004000080074030800700308006C03080017:100030006803080000000000640308006003080073:1000400078009FE50110A0E3041480E50110A0E30F:10005000081480E5F410A0E30C1480E560009FE52F:10006000DBF021E300D0A0E1040040E2D7F021E37F:1000700000D0A0E1040040E2D1F021E300D0A0E1F3:10008000040040E2D2F021E300D0A0E1800040E291:10009000D3F021E300D0A0E1040040E210F021E31E:1000A00000D0A0E11C009FE5010010E318E09F05CF:1000B00018E09F1510FF2FE1FEFFFFEAFEE7C046A4:1000C0000000FFFF900401003D010800B800080097:1000D000BD0008000000000000000000000000005B:1000E00000000000AA2108480160012107480160C2:1000F0005522074802600748016000210648016058:10010000F4210648016070471004FFFF1404FFFF4C:100110001804FFFF0404FFFF0804FFFF0C04FFFFA7:1001200004E005490A1C0139002AFBD1011C0138F1:100130000029F6D17047C046E8030000664806C8AB:100140000B1C134305D000230B70491C9142FBD1BB:10015000F5E76248C01C0323984306C80B1C1343F1:1001600006D00378401C0B70491C9142F9D1F1E78D:1001700000B5FFF7B7FFF0235948016899430160C4:10018000584A59480168114301600F2457480168D3:10019000A1430160564C5748016821430160534810:1001A0000168994301605348016811430160524A54 :1001B0004E48016891430160504A4E48016811431E :1001C00001604F4A49480168914301604D4A4948DE :1001D0000168114301604C4A4C4801689143016039 :1001E0004B4A4C480168114301604B4A474801683B :1001F00091430160494A4748016811430160484AF8 :100200004248016891430160464A424801681143EF :1002100001604549454801604548FFF781FF454970 :10022000454801604248FFF77BFF3F494248016073 :100230003F48FFF775FF41493F4801603C48FFF7E1 :100240006FFF3F493C4801603948FFF769FF3D496E :100250003D4801603648FFF763FF3C493A4801607A :100260003348FFF75DFF3A49374801603048FFF7F0 :1002700057FF2D49374801602D48FFF751FF2D49A1 :10028000354801602A48FFF74BFF27493248016093 :100290002748FFF745FF29492F4801602448FFF709 :1002A0003FFF27492C4801602148FFF739FF2549C6 :1002B0002A4801601E48FFF733FF244927480160A0 :1002C0001B48FFF72DFF2249244801601848FFF71B :1002D00027FF9EE700BDC046D4000800DC000800F0 :1002E00000F4FFFF0000000220F4FFFF0CF4FFFF0A :1002F0000000000150F4FFFF000F000000000004A8 :1003000000F000000000000800000F0008F4FFFFEC :100310000000001040F4FFFF0000F000000000208B :100320000000000F000000400000020024F4FFFF66 :100330002C0100000000010054F4FFFF0000040045 :10034000000008000000100044F4FFFF000020003F :100350000000400028F4FFFF58F4FFFF48F4FFFFBF:10036000FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEAF5:08037000FEFFFFEAFEFFFFEAB9:00000001FF它的第二行为::1000000018F09FE518F09FE518F09FE518F09FE5C0容易知道:它的ee为:C0,计算过程如下:C0=0x01+not(0x10+0x00+0x00+0x00+0x18+0xF0+…+0xE5)文件结束(EOF)记录Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下::00000001FF其中:00 是记录当中数据字节的数量。
hex文件解析(最重要全面)
1.汇编程序:ORG 0000HAJMP MAINORG 000BHAJMP TOINTORG 0100HMAIN:CLR P1.0MOV TMOD,#01HMOV TH0, #0FEHMOV TL0, #0CHMOV IE, #28HSETB TR0LOOP:SJMP LOOPORG 0300HTOINT:SETB P1.0CLR P1.0MOV TH0,#0FEHMOV TL0,#0CHRETIEND2.对应hex文件::0300000002030B ED:0C030B00787FE4F6D8FD75810702000041:020*********DD:02000B00610092:10010000C290758901758CFE758A0C75A828D28CF1:020*******FE6F:0B030000D290C290758CFE758A0C3202:00000001FF3.对hex文件结合汇编程序的解析::0300000002030B ED%在0000H地址上,存储指令LJMP 030BH.程序跳转到地址030BH处。
:0C030B00787FE4F6D8FD75810702000041%在030BH地址上,存储指令如下:%787F,(双字节指令),MOV Rn,#7F;(数据传送指令)%E4F6,(双字节指令),CLR F6;(F6位置清零)%D8FD,(双字节指令), DJNZ Rn,rel;%758107,(三字节指令),MOV 81,#07H;%020000,(三字节指令),LJMP 0000H;这两句程序和汇编程序本身没有关系,其实质为预先固化的程序,使得后面写入的程序从0000H开始执行。
:020*********DD% AJMP MAIN:02000B00610092% AJMP TOINT,000BH是中断地址的入口,中断响应程序存于此地址,中断响应以后开始执行中断服务程序,中断服务程序地址是0300H。
HEX文件格式
Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。
Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Int el HEX文件。
很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。
但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d, 0x0a)。
行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0 x01;”0a”,就表示0x0a。
对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。
下面为HEX文件中的一行::10000000FF0462FF051EFF0A93FF0572FF0A93FFBC“:”表示一行的开始。
“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。
第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
第7,8个字符“00”表示数据的类型。
该类型总共有以下几种:00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为::00000001FF以上的信息其实就足够进行HEX转BIN格式的程序的编写。
首先我们只处理数据类型为0x00及0x01的情况。
0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。
hex文件
hex文件解析Keil开发环境编程时对源程序进行编译链接后都可以成一个可执行文件即hex文件,但是有不完全是一个可执行文件。
然后可以通过烧录工具烧写到对应的单片机的flash中,当然也还有其他方法可以进行烧录。
大家在编程时是否对生成的hex文件有这样的疑问:1、当hex文件的大小大于单片机的flash时烧录工具还是可以把hex文件烧写到flash中呢;2、单片机运行的是二进制指令和数据,那么hex文件的内容是否都是二进制数呢;3、烧录工具是根据什么把程序指令和数据烧写到flash固定的位置呢。
我们就带着这三个疑问深入学习hex文件,想深入理解hex文件必须从内容入手。
查看hex 文件的很简单,用文本随便打开一个文件都可以看到hex文件的内容。
例如::020*********F2:1000000080040020690100087101000873010008E4:1000100000000000000000000000000000000000E0:100020000000000000000000000000007501000852:1000300000000000000000007701000879010008BE``````````````````````````````:1005E0002001000800000000006CDC020*********:1005F00000000000010203040607080900000000D3:04000005080000C12E:00000001FF上面就是一个hex文件内容首尾的一部分数据,从内容中很明显可以看出这不是二进制数据。
Hex文件是用ASCII来表示二进制的数值,十六进制数组成的指令或者数据,每一行就是一个hex记录。
由于单片机执行的只能是二进制指令和数据,而hex文件是十六进制数,所以烧录器的工作必然有一个进制转换机制。
具体机制怎么实现暂时可以不管,知道是烧录器处理的就行了。
hex与bin文件
1、HEX文件与BIN文件区别包含内容烧录信息文件存储形式文件大小HEX文件包括地址信息的一般都不需要用户指定地址以ASCII码形式表示十六进制的数值非实际数据大小BIN文件只包括了数据本身一定需要指定地址信息的十六进制数据实际数据大小BIN、hex 文件常用来保存单片机、ARM或其他处理器的目标程序代码,它保存物理程序存储区中的目标代码映象,一般的编程器都支持这种格式2、HEX文件2.1 HEX文件是用ASCII来表示十六进制的数值。
例如十六进制数值0x3F,用ASCII来表示就需要分别表示字符'3'和字符'F',每个字符需要一个BYTE,所以HEX文件需要 > 2倍的空间;2.2 Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。
打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示);每一行代表一个记录;下列两行为hex的两条文件记录:020*********F2:100000003810002045010008F7020008F902000836记录头(:) 数据长度数据地址数据类型数据校验记录结束占用字节数1Byte1Byte2Byte1Byte nByte1Byte2Byte 例1 : 02 0000 04 0800F2 回车、换行例2 : 10 000000 3810002045010008F7020008F9020008 36 回车、换行此表格数据“例”为16进制数(以ASCII码形式显示)说明数据长度:数据所占的字节数据数据类型:1) 00' Data Record//数据记录2) '01' End of File Record//文件结束记录每一个HEX文件的最后一行。
例如::00000001FF这样的一行数据内容是固定的,数据长度为0,地址为03) '02' Extended Segment Address Record//扩展段地址记录4) '03' Start Segment Address Record//开始段地址记录5) '04' Extended Linear Address Record//扩展线性地址记录由于每行标识数据地址的只有2Byte,所以最大只能到7K,为了可以保存高地址的数据,就有了Extended Linear Address Record。
S19与HEX文件格式解析
S19格式与HEX格式详解2019.03 S19 与 HEX文件中的所有字节都是可打印的 ASCII 字符,可用任何文本编辑器打开查看S19S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。
S19 格式是每一行为一个记录,每个记录由 6 个部分组成,除起始代码外,均用十六进制数大端格式表示:1.起始代码:一个大写字母“S”,表示一个新记录的开始。
2.记录类型:1 个十六进制位,取值 0~9,定义记录块的类型,详见下文。
3.字节数:2 个十六进制位,表示地址、数据、校验和的总字节数。
4.地址:4, 6 或 8 个十六进制位,具体的长度由记录类型决定,表示本条记录在内存中的起始地址。
5.实际数据:2n 个十六进制字符,n 为前面指定的字节数的值减去地址和校验和的长度。
6.校验和:2 个十六进制字符,为字节数、地址和实际数据的所有字节(两个十六进制位)的和对 0xFF 取模,再求反码得到。
一个完整的MOTOROLA S-Record格式数据包含如下区域:<type> <length> <address> <data> <checksum>各字段的意思分别如下:<type>:标示记录的类型,该字段占据1-byte。
它可以有如下数值:“S0”, “S1”, “S2”, “S3”, “S5”, “S7”, “S8” , “S9”“S0” -- 记录描述信息“S1”, “S2”, “S3” -- 记录存储的数据。
这三者的区别在于地址(address)的长度不同,S1为2-byte,S2为3-byte,以及S3为4-byte。
“S5” -- 包含了“S1”, “S2”, “S3”的信息。
十六进制文件格式
HEX格式内容含义HEX文件格式是我们经常遇到的一种文件格式,因为几乎所有的编程烧录文件都为HEX格式。
首先,HEX文件中是包含了地址信息的。
这和BIN文件不同,BIN文件中只包含了数据信息。
所以我们在烧写或者下载HEX文件的时候,一般不需要我们指定地址,但是在烧写BIN 文件的时候,用户是一定要指定地址信息的。
二、HEX文件都是由记录组成的。
它的每一行都是一个记录来的。
它是由任意数量的十六进制数组成。
每个记录包含五个域,它们以以下格式排列的::aabbbbcc[dd…]ee上面每一组不同的字母代表不同的一个域,每个字母代表一个十六进制的数字,每一个域至少由两个十六进制编码数字组成,每两个十六进制编码数字组成一个字节。
具体描述如下:1、每个HEX记录都由冒号开头;2、aa表示这个记录中的数据长度域,它代表记录当中数据字节[dd…]的字节数量。
3、bbbb是地址域,它代表记录当中数据的起始地址。
4、cc 是代表HEX记录类型的域,它可能是以下数据当中的一个:00 –数据记录01 –文件结束记录02 –扩展段地址记录04 –扩展线性地址记录5、dd 是数据域,它代表一个字节的数据,一个记录可以有许多数据字节。
记录当中数据字节的数量必须和数据长度域(aa)中指定的数字相符。
6、ee 是校验和域,它表示这个记录的校验和。
校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
比如:前面AduC7026的LED实验中的HEX文件内容为::020*********F2 。
1:1000000018F09FE518F09FE518F09FE518F09FE5C0 。
2:1000100018F09FE50000A0E118F09FE518F09FE5BB:100020004000080074030800700308006C03080017:100030006803080000000000640308006003080073:1000400078009FE50110A0E3041480E50110A0E30F:10005000081480E5F410A0E30C1480E560009FE52F:10006000DBF021E300D0A0E1040040E2D7F021E37F:1000700000D0A0E1040040E2D1F021E300D0A0E1F3:10008000040040E2D2F021E300D0A0E1800040E291:10009000D3F021E300D0A0E1040040E210F021E31E:1000A00000D0A0E11C009FE5010010E318E09F05CF:1000B00018E09F1510FF2FE1FEFFFFEAFEE7C046A4:1000C0000000FFFF900401003D010800B800080097:1000D000BD0008000000000000000000000000005B:1000E00000000000AA2108480160012107480160C2:1000F0005522074802600748016000210648016058:10010000F4210648016070471004FFFF1404FFFF4C:100110001804FFFF0404FFFF0804FFFF0C04FFFFA7:1001200004E005490A1C0139002AFBD1011C0138F1:100130000029F6D17047C046E8030000664806C8AB:100140000B1C134305D000230B70491C9142FBD1BB:10015000F5E76248C01C0323984306C80B1C1343F1:1001600006D00378401C0B70491C9142F9D1F1E78D:1001700000B5FFF7B7FFF0235948016899430160C4:10018000584A59480168114301600F2457480168D3:10019000A1430160564C5748016821430160534810:1001A0000168994301605348016811430160524A54:1001B0004E48016891430160504A4E48016811431E:1001C00001604F4A49480168914301604D4A4948DE:1001D0000168114301604C4A4C4801689143016039:1001E0004B4A4C480168114301604B4A474801683B:1001F00091430160494A4748016811430160484AF8:100200004248016891430160464A424801681143EF:1002100001604549454801604548FFF781FF454970:10022000454801604248FFF77BFF3F494248016073:100230003F48FFF775FF41493F4801603C48FFF7E1:100240006FFF3F493C4801603948FFF769FF3D496E:100250003D4801603648FFF763FF3C493A4801607A:100260003348FFF75DFF3A49374801603048FFF7F0:1002700057FF2D49374801602D48FFF751FF2D49A1:10028000354801602A48FFF74BFF27493248016093:100290002748FFF745FF29492F4801602448FFF709:1002A0003FFF27492C4801602148FFF739FF2549C6:1002B0002A4801601E48FFF733FF244927480160A0:1002C0001B48FFF72DFF2249244801601848FFF71B:1002D00027FF9EE700BDC046D4000800DC000800F0:1002E00000F4FFFF0000000220F4FFFF0CF4FFFF0A:1002F0000000000150F4FFFF000F000000000004A8:1003000000F000000000000800000F0008F4FFFFEC:100310000000001040F4FFFF0000F000000000208B:100320000000000F000000400000020024F4FFFF66:100330002C0100000000010054F4FFFF0000040045:10034000000008000000100044F4FFFF000020003F:100350000000400028F4FFFF58F4FFFF48F4FFFFBF:10036000FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEAF5:08037000FEFFFFEAFEFFFFEAB9:00000001FF它的第二行为::1000000018F09FE518F09FE518F09FE518F09FE5C0容易知道:它的ee为:C0,计算过程如下:C0=0x01+ not(0x10+0x00+0x00+0x00+0x18+0xF0+…+0xE5)文件结束(EOF)记录Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下::00000001FF其中:00 是记录当中数据字节的数量。
S19与HEX文件格式解析
S19格式与HEX格式详解2019.03 S19 与 HEX文件中的所有字节都是可打印的 ASCII 字符,可用任何文本编辑器打开查看S19S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。
S19 格式是每一行为一个记录,每个记录由 6 个部分组成,除起始代码外,均用十六进制数大端格式表示:1.起始代码:一个大写字母“S”,表示一个新记录的开始。
2.记录类型:1 个十六进制位,取值 0~9,定义记录块的类型,详见下文。
3.字节数:2 个十六进制位,表示地址、数据、校验和的总字节数。
4.地址:4, 6 或 8 个十六进制位,具体的长度由记录类型决定,表示本条记录在内存中的起始地址。
5.实际数据:2n 个十六进制字符,n 为前面指定的字节数的值减去地址和校验和的长度。
6.校验和:2 个十六进制字符,为字节数、地址和实际数据的所有字节(两个十六进制位)的和对 0xFF 取模,再求反码得到。
一个完整的MOTOROLA S-Record格式数据包含如下区域:<type> <length> <address> <data> <checksum>各字段的意思分别如下:<type>:标示记录的类型,该字段占据1-byte。
它可以有如下数值:“S0”, “S1”, “S2”, “S3”, “S5”, “S7”, “S8” , “S9”“S0” -- 记录描述信息“S1”, “S2”, “S3” -- 记录存储的数据。
这三者的区别在于地址(address)的长度不同,S1为2-byte,S2为3-byte,以及S3为4-byte。
“S5” -- 包含了“S1”, “S2”, “S3”的信息。
hex文件格式详解
学习的路上,越努力越渺小。
——单片机初学者在学习单片机的路上,我用过KEIL、CodeWarrior、CCS等编译器,但最近因一个小项目,采用的PIC18F25K80芯片,使用MPLAB的PICC18编译器,在烧写代码的时候,突然意识到自己一直在使用.Hex文件,但从未对该文件去研究、理解过,从而有此下文:Hex文件通常由编译器在项目编译链接后生成,用于传输被存储于ROM或者EEPROM 的程序或数据,可在项目工程目录下查找到。
用记事本或者Notepad++打开hex文件,hex 文件由一行行“:数字”组成,每行以冒号开头,内容全部为16进制数字。
Hex文件每行都是一个十六进制的记录,该记录由5各部分组成:数据长度(1个字节)、数据起始地址(2个字节,高位在前,低位在后)、记录类型(1个字节)、数据(n个字节)、校验码(1个字节)。
打开Hex文件,如下::020*********F2:101800002039002055190008A1270008A327000847:1018100000000000000000000000000000000000C8…:10C000001A67296887689968A768B20529A401009A:10C01000204214021440420A0313DA0342140313A9:08C020000B03420A0327DB03B6:04000005080018BD1A:00000001FF以:101800002039002055190008A1270008A327000847为例:“0x100x180x000x000x200x030x900x020x550x190x000x080xA10x270x000x080xA3 0x270x000x080x47”“:”表示记录开始;“回车换行”表示记录结束;“0x10”表示数据长度是16,即本条记录数据是16个字节;“0x180x00”表示数据起始地址,即本条记录的数据起始地址为0x1800;“0x00”表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。
stm32之.hex 文件
05 Start Linear Address Record:开始线性地址记录
然后是数据,最后一个字节为校验和。
校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检
验和= 0x100 -累加和
00 Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
01EndofFileRecord:用来标识文件结束,放在文件的最后,标识HEX
文件的结尾
02 Extended Segment Address Record:用来标识扩展段地址的记录
03 Start Segment Address Record:开始段地址记录
stm32之.hex文件
1.我们设置编译程序的编译器(如图),这个设置意思是把程序下载到
flash的0x0800 0000开头的位置,然后编译程序
2.编译完程序后,在工程目录的output文件夹中找到编译后生产的.hex文
件;
用notepad++或者UltraEdit打开开头,内容全部为16进制码(以ASCII
码形式显示)
(2)在HEX文件里面,每一行代表一个记录。记录的基本格式为:
第一个字节表示本行数据的长度;
第二、三字节表示本行数据的起始地址;
第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、
0x05。
打开.hex内容如下:(中间部分数据略去)
hex文件和bin文件的区别和转换代码
cur_offset = 0; cur_base ++; highc = cur_base >> 8; lowc = (unsigned char)cur_base; cksum = 2 + 4 + highc + lowc; cksum = 0xFF - cksum; cksum = cksum + 1; sprintf (write_buf, ":02000004%04x%02x", cur_base, cksum); write_buf[15] = 0x0D; write_buf[16] = 0x0A; fwrite (write_buf, 1, 17, fp_write);
unsigned long start_adr; /* 转换成Hex格式的起始地址 */ unsigned short cur_base; /* 转换成Hex格式的当前地址高16位 */ unsigned short cur_offset; /* 转换成Hex格式的当前地址低16位 */
unsigned char read_buf[16]; unsigned char write_buf[48];
highc, lowc, read_buf[0], read_buf[1], read_buf[2], read_buf[3], read_buf[4], read_buf[5], read_buf[6], read_buf[7], read_buf[8], read_buf[9], read_buf[10], read_buf[11], read_buf[12], read_buf[13], read_buf[14], read_buf[15], cksum); write_buf[43] = 0x0D; write_buf[44] = 0x0A; fwrite (write_buf, 1, 45, fp_write);
串口字符串-HEX格式
串⼝字符串-HEX格式串⼝字符串-HEX格式C++Serial SerialPo rt HEX介绍串⼝通信过程中 通常涉及⼀个数据的模拟过程以及数据发送过程, ⼀般来说, 我们会发送⼀串指令给下位机68050084010203例如这种, 我们明⽩ 这是我们 将相应的字符转换成 hex 字符显⽰,⽤于表⽰ascii 字母的使⽤, 但是在程序中 我们可以直接使⽤ 字符串表⽰我们想写⼊的字符, 容纳后转换之后 串⼝数据相应的ASCII码的过程,下⾯ 介绍⼀下常⽤的转换函数数据格式在我们的描述中,⾸先给出⼀个 或者参考的详细介绍此处我们均使⽤ "abc123" 作为字符串在各个⾥⾯的显⽰来表⽰1. 字符串 string 指的是 "abc 123" 这种能⽤ascii 表⽰的 能够打出来的字符, 由于我们部分字符不能打出来,或者说是 不可显⽰字符,只⽤于控制指令, 存在缺陷 string str = "abc123"2. 字符串数组 char [] uchar[] 指 cpp 中 的⼀种数据, 存放的char 型或者 uchar 的字符, 我们可以使⽤ -128-127 或者 0-255的数字表⽰, 我们暂时均认为是 uchar 的数组 便于后续处理 uchar buffer= {97,98,99,49,50,51}3. 字符串指针 char* uchar * 是类型指针,⼀般指向的是字符串数据的⾸地址,由于我们处理过程中 很多函数 认为 0x00 '\0' 是结束,所以处理的时候尽量传⼊ 长度 uchar *buffer = buffer4. hex 字符串 将字符串数组⾥⾯的值转换成16进制的两位值,然后使⽤空格分割, 便于输⼊指令, 例如 string command="61 62 6331 32 33"这种合适各有优劣, ⽐如我们在常⽤的 Modbus 控制中 使⽤ 这种控制命令发送到下位机, ⼀般直接在串⼝输⼊, 然后使⽤ hex 发送即可, 但是如果我们测试过程中 需要将相应的数据按照两位的段, 填⼊txt ⽂本中, 每次读取⼀⾏数据, 然后将数据转换成 ascii 便能模拟 ⼆进制流的输⼊输出6813008511122122313200000100000200000388 FF 010********F数据格式转换1. uchar 数据和 char 字节数据的相互转换char 类型的数据 -128-127, uchar 类型数据 0-255, 均是⼀个字节, char 类型的⾸位数据为符号位, 所以会存在从 127(0111 1111)+1 之后变成 -128(1000 0000) 的变换, 然后也会存在从-1(1111 1111) 到 0(0000 0000) 的变换, 详细可以搜索 char 溢出 与 数据补码 的相关内容,所以 uchar -char 的相互变换可以考虑成 两个部分uchar 的 [0, 127] == char [0,127]ucahr 的 [128, 255] == char [-128,-1]// uchar 数据转换 char >127 c1-256char Utils_String::UChar2Char(uchar c1){return static_cast<char>(c1 > 127 ? c1 - 256 : c1);}// char 类型转换 uchar <0 -- c1 +256uchar Utils_String::Char2UChar(char c1){return static_cast<uchar>((c1 < 0 ? 256 + c1 : c1));}2. hex 与数字的相互转换⼀般的 hex 表⽰的 16进制字符, 由于为了便于我们进⾏显⽰, 16进制由 0-9 a-f 供给16个字符依次表⽰ 0-15 , 此处暂时不考虑 ⼤写字母,⼤写的A-F 等同于⼩写的a-f,由于 uchar 类型的数据在 0-256之间, 正好可以表⽰成 2个16进制字符来进⾏表⽰, 使⽤前缀字符0x 表⽰16进制, 0o 表⽰8进制 0d 表⽰10进制 [0,255] ==[0x00,0xff]我们建⽴⼀位字符0-f 与 0-15 之间的转换, 有两种转换⽅式, ⼀种就是if 判断进⾏强制转换, 另外⼀种 是使⽤ 码表的排列进⾏⼀定 的优化处理1位hex 与num 的相互转换代码2位hex 与 uchar相互转换3. 给定字符串转换成字符串数组由于 原⽣的 string 存在字符转指针的转换可以使⽤ 原⽣的指针来处理/*** @fn const uchar * Utils_String::String2Uchar(const std::string & str)** @brief String 2 uchar** @author IRIS_Chen* @date 2019/12/16** @param str The string** @return Null if it fails, else a pointer to a const uchar*/const uchar * Utils_String::String2Uchar(const std::string & str){return (uchar*)str.c_str();}/*** @fn std::string Utils_String::Uchar2String(const uchar * buffer)** @brief Uchar 2 string** @author IRIS_Chen* @date 2019/12/16** @param buffer The buffer** @return A std::string*/std::string Utils_String::Uchar2String(const uchar * buffer){std::string str = (char*)buffer;return str;}4. hex 字符串 转换 字符串数组依次取两个字符, 转换成⼀个 ucahr 值 存⼊数据中即可hex 字符串 与字符串数组的相互转换更多⼤概就这么多常⽤的转换过程, 还存在⼀个 单独 数组转换 字符串的函数, 可以使⽤ sprintf 格式化输出, 或者使⽤ 暴⼒循环取余得到最后的结果值数字与字符串的转换 可多位 多进制。
解读hex文件
PIC HEX文件格式分析- 适用MPLAB8位機2011-03-25 11:26:40 阅读39 评论0 字号:大中小订阅本文引自:/212583/95624概要.HEX文件是MPLAB生成的一种可执行文件的格式,它本身是由ASCII字符组成的,但其包含16进制的可执行代码的信息,也就是说,这类文件描述在程序存储器的哪个单元放入什么指令。
.HEX文件的种类MPLAB可以生成3种不同格式的可执行文件。
其中两种是.HEX文件,它们分别称为INHX8M格式(Intel Hex Format)和INHX32格式(Intel Hex 32 Format);另外一种称为INHX8S格式(Intel Split Hex Format),这种格式会同时生成.HXL和.HXH文件,两个文件分别存放指令数据的低字节和高字节。
这里只讨论两种.HEX文件。
MPLAB内嵌的连接器MPLINK在默认情况下生成INHX32 格式的.HEX文件,也可以使用/aINHX8M选项指定生成INHX8M格式的.HEX文件。
我们的烧写器应该能支持这两种格式的.HEX文件。
INHX32格式的.HEX文件一个INHX32格式的.HEX文件是由若干个形式相同的行构成的。
行的种类对于最多只有8K字程序空间的PIC16F87X单片机而言,相应的.HEX文件只有3种不同的行:线性地址定位行,代码数据行,结尾标志行。
一个.HEX文件的第1行是一个线性地址定位行,后面接着是若干个代码数据行,最后一行是结尾标志行。
线性地址定位行仅仅对超过32K字代码的程序有用。
实际上,INHX32格式与INHX8M格式的不同之处就在于它能表示超过32K字代码的程序。
线性地址定位行中指定指令存放地址的高16位,而低16位由代码数据行中的“AAAA”部分指定。
“AAAA”表示指令存放地址的2倍,所以最多能表示32K字的指令,而PIC16F87X单片机最多只有8K字程序空间,故不需要用到指令地址的高16位,因此.HEX文件的线性地址定位行指定的指令地址的高16位总为“0000”。
Intel HEX格式说明
Intel HEX格式说明Intel HEX文件是记录文本行的ASCII文本文件。
后缀为.hex在Intel HEX文件中,每一行是一个HEX记录,它由十六进制数组成的机器码或者数据常量。
Intel HEX文件经常被用于将程序或数据传输存储到ROM,EPROM。
大多数编程器和模拟器使用Intel HEX文件。
1.记录详解Intel HEX文件由若干个数据记录组成,每个字符都是ASCII字符表示。
每一条数据记录以冒号开始,ASCII码为0x3A,以一个回车和一个换行结束,回车的ASCII码为0x0d,换行的ASCII码为0x0a 。
一个Intel HEX文件可以包含任意多的十六进制记录,每一行为一条记录。
每条记录有六个区域。
通常记录的格式如下图所示:记录的一般结构下面是一个记录的格式。
:llaaaatt[dd...]cc每一组字母是独立的一个域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述:: 冒号是每一条Intel HEX记录开始的标志ll是这条记录的长度域,它表示INFO or DATA域[dd…]的字节bytes个数aaaa 是地址域,它表示数据的起始地址<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址> tt表示这条HEX记录的类型,有6种类型00 ----数据记录Data Record (8-, 16-, or 32-bit formats)01 ----文件结束记录End of File Record(8-, 16-, or 32-bit formats)02 ----扩展段地址记录Extended Segment Address Record(16- or 32-bit formats)03-----起始段地址记录Start Segment Address Record(16- or 32-bit formats)04-----扩展线性地址记录Extended Linear Address Record(32-bit format only)05-----起始线性地址记录Start Linear Address Record(32-bit format only)dd是数据域,表示一个字节的数据,一个记录可能有多个数据字节,长度域ll域的数值大小说明了数据域字节数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前两天做s3c2440的nandfalsh实验时,有些问题(函数的指定地址存放)没有弄懂,今天花了一天的时间,算是把这个问题给解决掉了,为了更加深入的了解以及以后的复习之用,决定把他总结以下。
首先,先认识一个问题,就是为什么能够指定地址存放?这个就涉及到生成hex镜像文件(不是bin文件),hex文件中包含了下载的地址(后面会详细解释),当下载软件如j-link,j-tag或是usb下载会根据hex文件中的地址信息将代码下到指定的地址单元中去。
这里需要注意的是由于nandflash是不参与cpu编址的,它的地址是相对自己而言,所以如果要在nandflash中下载到指定地址,需要通过u-boot来实现。
并且u-boot 必须支持这个功能,而其他的存储器是没这个问题,因为它们参与cpu的统一编址。
好,现在问题来了,hex中的地址怎么来的呢?这个就是ads link器功劳了,我们指导ads连接器在配置的时候有三种模式,第一种模式很少用,一般我们是使用第二种而第三种,第二种是用的最多的,是生成简单的链接文件,不能对函数实现指定地址存放,第三种是生成复杂的链接文件,可以实现函数的指定地址存放,这是通过scatter文件实现的(后面会详细介绍)下面就看一下hex文件全称Intel HEX ntel HEX文件是由一行行符合Intel HEX 文件格式的文本所构成的ASCII文本文件。
在Intel HEX文件中,每一行包含一个HEX记录。
这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。
Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。
大多数EPROM编程器或模拟器使用Intel HEX文件。
记录格式
Intel HEX由任意数量的十六进制记录组成。
每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。
每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
: 每个Intel HEX记录都由冒号开头.
ll 是数据长度域,它代表记录当中数据字节(dd)的数量.
aaaa 是地址域,它代表记录当中数据的起始地址.
tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 –数据记录
01 –文件结束记录
02 –扩展段地址记录
04 –扩展线性地址记录
05 - 开始线性地址记录后面则是真正的数据记录
dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数
据字节的数量必须和数据长度域(ll)中指定的数字相符.
cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.
数据记录
Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中数据字节的数量.
2462 是数据将被下载到存储器当中的地址.
00 是记录类型(数据记录)
464C…464C是数据.
33 是这个记录的校验和.
扩展线性地址记录(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC
其中:
02 是这个记录当中数据字节的数量.
0000 是地址域,对于扩展线性地址记录,这个域总是0000.
04 是记录类型04(扩展线性地址记录)
FFFF 是地址的高16位.
FC 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址2462
扩展线性地址记录的数据域+ FFFF
------------
绝对存储器地址FFFF2462
扩展段地址记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下:
:020*********EA
其中:
02 是记录当中数据字节的数量.
0000 是地址域.对于扩展段地址记录,这个域总是0000.
02 是记录类型02(扩展段地址记录)
1200 是地址段.
EA 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址2462
扩展段地址记录数据域+ 1200
---------
绝对存储器地址00014462
文件结束(EOF)记录
Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下:
:00000001FF
其中:
00 是记录当中数据字节的数量.
0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址.
01 是记录类型01(文件结束记录)
FF 是这个记录的校验和,计算方法如下:
01h + NOT(00h + 00h + 00h + 01h).
Intel HEX文件例子:
下面是一个完整的Intel HEX文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
Hex文件的INTEL格式:这是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示.
这是一个例子:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录1 记录文件结束2 扩展段地址记录3 开始段地址记录4 扩展线性地址记录5
开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.
扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围,所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.
一个段地址定义的格式如下:
起始符长度起始地址扩展段标示扩展段序号无用累加和
: 02 0000 02 3000 EC
段地址的标识符是第四组数据02,表示扩展地址段的定义,再后面的以为HEX数表示段的数目,
上面的定义为3,表示段地址是3,所以下面的数据地址是3 + XX(XX是64K段内的地址)。