【1】“hex文件”内容解析
hex文件是Intel公司提出的按地址排列的数据信息格式,数据宽度为字节,所有数据使用十六进制数字表示,并且以ASCII码的形式,按行记录数据。(即hex文件是用ASCII来表示二进制的数值)通常用于传输将被存于ROM或这EPROM中的程序和数据。
hex文件每一行均以“:”开头,表明记录的开始,“:”之后,每至少2个字符表示一组十六进制数据,格式形如:LLAAAATTDD....DDCC。
“:”、“LL”、“TT”、“CC”占1个字节;“AAAA”占两个字节;“DD....DD”占0 ~ N个字节
一旦出现段地址或者线性地址,之后所有数据都要加偏移地址,直到出现一个新的段地址或者线性地址,再重新变更偏移地址。
数据物理地址 = 线性地址左移16位+段地址左移4位+偏移地址。
示例:
:020000040108EA 线性偏移地址:0x0108
:0200000212FFBD 扩展段地址:0x12FF
:0401000090FFAA5502 数据地址:0x0100
基地址:0108左移16位为0x01080000;
扩展段地址:12FF左移4位为0x00012FF0;
下一行数据的偏移地址:0x0100
实际物理地址:0x01080000 + 0x00012FF0 + 0x0100 = 0x010930F0
举例分析:某工程代码的hex文件局部内容:
:02000004003DBD①
:04801000007DF9A155②
:20801200FF5A8EA4C5A492ABEC079CFF88A992859687000EFFFE92AB88A9A9A90FA6EC10AE③
:2080220093AAEC0EA9A99DFF5CA876BFFFFE92859687000EFFFE92859687000CFFF88AA043④
…
:200EC4008E77003D8E7E003D8E86003D8EB5003D8EE4003D8EFB003D8F2A003D8F5A003D21
:140ED4008F8A003D8FB9003D8FE8003D9017003D9046003D84
:00000001FF
1.:02000004003DBD(实质为“十六进制”表达形式:0x02,0x00,0x00,0x04,0x00,0x3D,0xBD)
释义:02表示该行数据的长度(字节数);
0000表示该行数据的起始地址(若该行数据的数据类型为00,则为偏移地址);
04表示该行数据的数据类型[1];
0x00,0x3D为数据[2];
0xBD为校验和[3]。
2.每行数据的起始地址计算:
第①行数据基地址(首行):0x0000 +(0x003D << 16)= 0x003D0000
第②行数据基地址:0x003D0000 + 0x8010 = 0x003D8010
第③行数据基地址:0x003D0000 + 0x8012 = 0x003D8012
第④行数据基地址:0x003D0000 + 0x8022 = 0x003D8022
注释:[1].“00”Data Rrecord:数据记录
“01”End of File Record::表征该.hex文件结束
“02”Extended Segment Address Record:标识扩展段地址记录
(后面所有数据地址需要加上段地址左移4位)
“03”Start Segment Address Record:起始/开始段地址记录
(大部分hex中不使用该记录类型,关于该记录类型的描述很少,具体作用不详)
“04”Extended Linear Address Record:标识扩展线性地址记录
(后面所有数据地址+线性地址左移16位,将该地址左移16 位后作为基地址,并且表示在下一个04类型行出现之前都要使用该地址作为基地址来使用。)
“05”Start Linear Address Record:起始/开始线性地址记录
(程序/函数入口地址,程序入口地址未必是main函数地址)
[2]. 十六进制数据:字节顺序根据芯片大小端和字长决定。
处理器若为大端存储,高字节在前,低字节在后(如NXP的5744P);
小端存储,则低字节在前,高字节在后(如STM32、DSP)。
示例:: 0401000090FFAA5502
大端存储的处理器内存中表示:
内存地址 |
数据 |
0x0109F1 |
0x90 |
0x0109F2 |
0xFF |
0x0109F3 |
0xAA |
0x0109F4 |
0x55 |
常用的X86结构是小端模式,而KEIL C51为大端模式。很多ARM、DSP均为小端模式。部分ARM处理器可以随时在程序中(ARM Cortex系列使用REV、REV16、REVSH指令)进行大小端的切换。
[3].校验和计算方式:0x0100与除校验字节外所有字节累加和(不计进位)的差值。
例:0xBD = 0x0100 –(0x02 + 0x00 + 0x00 + 0x04 + 0x00 + 0x3D)
3.hex文件与bin文件格式区别:
hex文件包括地址信息(烧写或下载hex文件,一般不需要用户指定地址),bin文件格式只包括数据本身(烧写bin文件时,用户需要指定地址信息)。
【2】“out”文件内容解析
.out文件是由类似Unix的操作系统(如Linux和AIX)中的各种源代码编辑器创建的编译可执行文件。可以存储可执行代码、共享库或目标代码。(当今.out文件慢慢被COFF(公共对象文件格式)格式所取代)
【3】“bin”文件内容解析
bin文件是最纯粹的二进制机器代码。或者说是"顺序格式",按照assembly code顺序翻译成binary machine code,内部没有地址标记。bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。
简单总结一下这两种文件格式的区别:
1、hex文件包含地址信息而bin文件只包含数据本身,烧写或下载hex文件时,一般不需要用户指定地址,因为hex文件内部已经包含了地址信息。烧写bin文件时则需要用户指定烧录的地址信息。
2、hex文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此hex文件至少需要2倍bin文件的空间。
3、hex可以直接转换为bin文件,但是bin文件要转化为hex文件必须要给定一个基地址。
【4】“map”文件内容解析
map文件是CCS软件编译后产生的有关DSP用到所有程序、数据及IO空间的一种映射文件。
map文件大概分为文件头、内存配置、段映射、全局符号四部分。
注释:
1. 内存配置与cmd文件中的MEMORY指令关联,在cmd文件中定义的程序与数据区间定义,在该部分均可以找到对应,与cmd文件不同的是,在map文件中加入了一个实际使用的区间,即在程序中实际用到的空间长度。
2. 段映射部分与cmd文件中的SECTION指令关联,在该部分程序中所有的段实际映射的起始地址与实际长度均有详细说明。可以具体到程序中PROGMA指定的段和各个单独文件产生的obj文件。
3. 全局符号可以是程序使用的每一个函数、程序中定义的全局变量均可以在此找到对应的起始地址。map文件中采用两种方式列举,一种为按相应地址排列,另一种按全局符号字母排列。