我有一个带有 Attiny45 固件的 HEX 文件。我想要做的是提取某种编码在其中的公式。我做了一些研究(主要是发现“这是不可能的”等)但我决定我可以尝试一下,因为我的研究的其他部分向我表明,大多数提出此类问题的人几乎不知道什么是 HEX 文件。
这篇文章的目的不是从 HEX 文件中提出一个明亮的 C 代码,而是建立关于该主题的扎实知识。我知道编译器在完成其工作时可以使我自己的工作更加困难,但是需要遵循某种结构(可能是原始结构)以使 CPU 能够执行代码。
所以,我坐在我的桌子上编写了一个小 Python 工具来帮助我完成这个过程。它加载 HEX 文件,我可以交互地向其中添加信息。这是我到目前为止所得到的:
HEX 文件的第一行说:
: 02 0000 04 0000 FA
该工具将其解码为:
: --> MARK
02 --> RECORD LENGTH
0000 --> LOAD OFFSET
04 --> RECORD TYPE (EXTENDED LINEAR ADDRESS RECORD)
0000 --> DATA
FA --> CHECKSUM
似乎这一行是为了告诉应该放置代码的初始地址是0x0000.
其次,下一行说:
: 20 0000 00 34C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50C07EEE7EB9 51
该工具将其解码为:
: --> MARK
20 --> LENGHT OF THE RECORD
0000 --> OFFSET
00 --> RECORD TYPE (00 -> DATA RECORD) 34C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50C07EEE7EB9 (ACTUAL DATA)
51 --> CHECKSUM
这就是乐趣和问题的开始。
我在任何地方都找不到 ATTiny45 的内存映射。我认为它应该在数据表或指令集手册中的某个地方。据我
0x0000所知,中断向量(第 49 页,数据表)和第一个是复位向量。所以,AVR 是小端的,指令是 16 位宽的,我可以解码重置向量包含值0xC034。使用指令集,我发现0xC034是:rjump 0x034这个对吗?
继续这个思路,前面指出的同一条线表明一些中断向量有值
0xFFFF,这让我感到惊讶,但似乎不是问题,因为这些可能会被禁用。唯一具有工作值的其他向量是USI_OVF_ISR,它等于0xC050。所以,根据之前提出的想法,这说USI_OVF_ISR有指令:rjump 0x050这也是正确的吗?
如果重置向量指向
0x034,则表示程序将从 开始运行0x034。下一行: 20 0020 00 7FE77FB9B89A089570EE7EB95FB9B89A08957EEE7EB9B898089570EE7EB9B898 22显示
0x034是0xB898,那是将要执行的第一条指令。这个对吗?