80386微码反汇编

2026-05-23 1 阅读 nand2mario
Reenigne 博客 我想到的东西 « 8086 微码反汇编 80386 微码反汇编 在我发布 8086 微码反汇编之后,Ken Shirriff 给我发了一张 80386 微码 ROM 的高分辨率图像。我没想到我会用它做任何事情,原因有两个:一个是它与 8086 相比绝对巨大(94720 位) (10752 位)所以(即使使用 bitract 或类似的)转码和检查也会非常乏味。另一个原因是我不知道从哪里开始——至少8086有一项专利,它给出了总体轮廓和一些我可以搜索的代码块。 80386 是一个完整的黑匣子。我知道它的作用,并且大致了解它如何工作,但将其变成我可以在一大堆二进制文件中搜索的东西似乎是一个难以克服的挑战。几年后,我在 Discord 上与 GloriousCow 和 Smartest Blob(可能还有其他人)交谈,他们提到获得 80386 芯片的高分辨率图像并尝试从中提取微代码会很有趣。我提到第一部分已经完成,但是将图像转换为二进制 blob,并将二进制 blob 转换为可理解的微代码似乎太难了。好吧,他们可能认为这是一个挑战 - 他们在这个问题上投入了各种图像处理、人工智能和人工辅助自动化技术,几天后从图像中提取了二进制斑点并进行了交叉检查。不过,拆卸它仍然是一个很大的挑战!我们发现了各种模式,并逐渐弄清楚如何将其重新排列为一个轴上的 μ-op 和另一轴上的 μ-op 位。然后是读取 μ-op 的顺序(通过一端未使用的 μ-op 块的帮助)。以及如何将 μ-op 位划分为字段。根据 8086 微码工作,我假设其中两个字段是要从中复制的源寄存器和目标寄存器。我还知道 80386 可以在 2 个周期内执行 ALU 操作,这表明必须有一个字段来指定 ALU 的第二个输入,以便这些操作的微代码可以在第一个周期中将两个操作数加载到 ALU,然后在第二个周期中将输出加载到目的地。还有一种有一定规律性发生的模式,我们怀疑它可能表明指令的结束(我们是对的)。 Ken 也通过追踪 80386 芯片上的各种线路和逻辑位来提供帮助,以便我们可以看到事物是如何连接的。渐渐地,画面变得更加清晰。每次我们弄清楚一些事情时,它都会为使用相同结构的其他微代码块的含义提供线索。与此同时,我们正在致力于解码指令解码器(由多个较小的 PLA 组成)和保护测试 PLA。最终我们达到了可以将 386 条指令与微代码块关联起来的程​​度,事情变得更加清晰。对于大多数指令来说,80386 在每个周期上比 8086 快得多,这是通过在问题上投入更多晶体管来实现的壮举 - 由 8086 中的微代码实现的许多算法本质上是在 80386 中“硬件加速”,所以我很早就意识到更多的 80386 微代码将设置这些加速器而不是直接体现算法。弄清楚加速器(如乘法和除法硬件、桶形移位器和保护测试单元)和微代码之间的接口是一项艰巨的工作。根据微码,80386 有多少种不同的指令?这些是什么?微代码有 215 个来自解码 ROM 的入口点 - 比 8086 的 60 个入口点增加了很多!其中一部分是新指令,一部分是指令由不同的例程处理,具体取决于它们的操作数是寄存器还是内存、CPU 是否处于实模式还是保护模式以及 REP 前缀是否正在运行等。我不会在这里全部列出它们,但如果您感兴趣,可以在 fields.txt 文件中找到它们(以及所有子例程和共享代码)。列出顶级微代码例程大小并没有多大意义,因为其中许多微代码例程执行少量工作,并且跳转到与另一个入口点共享的例程。列出每个入口点处理的操作码数量也没有意义,因为指令解码器不仅仅使用操作码来确定要使用哪个例程。是否有微代码未处理的指令?令人惊讶的是,没有!与 8086(也不同于现代 CPU)不同,80386 始终执行 μ 操作,并且每条指令都有微代码。微代码是否包含任何不执行任何操作的“垃圾代码”?从 0x849 到 0x856 的例程(在微代码反汇编中标记为“未使用?”)似乎没有任何与之关联的入口点。我不完全确定它的作用,但它与 th 有很多共同点