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

Amm*_*mar 6 c embedded microcontroller pic bootloader

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

:040C0000E2EFFFF030
Run Code Online (Sandbox Code Playgroud)

04:字节数

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

00:数据记录

E2EFFFF0:数据序列

30:校验和

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

:020000040001F9
Run Code Online (Sandbox Code Playgroud)

02 :字节数

0000: 地址

04:扩展线性地址记录

0001:数据

F9:校验和

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

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

更新

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

:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E
Run Code Online (Sandbox Code Playgroud)

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

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

jeb*_*jeb 5

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

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

所以公式是(linAddr <<16) + addror 在你的情况下 ($0001 << 16) + $FFC0

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