你怎么理解Hex文件? (扩展地址记录)

时间:2013-12-27 21:23:38

标签: c embedded microcontroller pic bootloader

我正在尝试为PIC18制作一个引导程序,所以我需要了解如何正确处理hex文件。例如,我理解如何处理以下十六行。

:040C0000E2EFFFF030

04:字节数

0C00:十六进制数字的地址

00:数据记录

E2EFFFF0:数据序列

30:校验码

所以我知道如何处理上面这行,但是下面的十六行怎么样。

:020000040001F9

02:字节数

0000:地址

04:扩展线性地址记录

0001:数据

F9:校验码

但究竟我该怎么做呢?我是否将这些数据写入该地址?你能把它翻译成机器语言吗?

顺便说一句,我的应用程序从地址0c00开始,bootloader从地址0020开始,在它上面,是中断向量。谢谢!

更新

如果hex文件的第三行如下,地址FFC0会改变吗?

:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E

我在想,因为hex文件的第二行有04(扩展线性地址记录),那么我应该将0001添加到第三行FFC0的地址,所以新地址就是这样。

$0001 + $FFC0将等于1FFC0,因此第3行的下一组数据字节应写入此地址1FFC0,这是正确的吗?

1 个答案:

答案 0 :(得分:4)

来自维基百科Intel Hex(此类信息的明显来源)

  

04,扩展线性地址记录,允许完全32位   寻址(高达4GiB)。地址字段为0000,字节数为   02.两个数据字节(大端顺序的两个十六进制数字对)代表所有后续的32位地址的高16位   00类型记录,直到下一个04类型记录到来。如果没有   04类型记录,高16位默认为0000.得到绝对值   后续00类型记录的地址,由...指定的地址   最近04记录的数据字段被添加到00记录中   地址。

因此公式为(linAddr <<16) + addr或在您的情况下($ 0001&lt;&lt; 16)+ $ FFC0

对于02 /扩展段地址记录的情况,公式更改为
(segAddr << 4) + addr