用 Haskell 写 LC-3 反汇编器:没有元数据时怎么分清代码和数据
来源:abhinavsarkar.net — 2026-10-30
📋 概述
LC-3 目标文件里没有节表、符号表、重定位信息,只有混在一起的 16 位字,于是同一个字节既可能是一条合法的 JSRR R6,也可能只是字符串的一部分。作者用多趟算法破解这个歧义:先解码确定无歧义的指令,再借已解码指令的上下文推测其余部分直到不动点,然后合并字节清理数据,最后插入标签。实现用 ST 单子加可变 Vector 做原地修改。
🔑 核心要点
- LC-3 只有 18 条指令、8 个 16 位寄存器、64KB 可寻址内存,指令本身也是 16 位。
- 目标文件里代码和数据自由混排,因为 16 位地址空间容不下节表这类元数据。
- 四趟流程:无歧义解码 → 上下文推测到不动点 → 字节合并 → 插标签。
- 实现用 runST + 可变 Vector,在纯函数接口下做原地修改。
- 作者强调这套启发式方法可推广到其他二进制分析里的代码与数据分离。
💡 金句
A disassembler looking only at binary code has no context.
👍 0
👎 0
← 返回 Lobsters 首页