【发布时间】:2015-06-22 18:22:36
【问题描述】:
我正在尝试反汇编 68000 的 BIOS 映像,但我无法让 IDA Pro 6.5 正确交叉引用地址。
对于那些不知道的人,摩托罗拉 68000 有几个与寻址相关的有趣功能/怪癖:
- 当给定一个 16 位绝对地址时,处理器会在取消引用之前将其符号扩展为 32 位。
- 68K 使用 24 位地址总线,因此 32 位地址中的高字节被忽略。
此 BIOS 的原始作者在许多地方利用这些属性来节省几个字节:对于 0xFF8000 以上的任何地址,可以仅使用两个字节而不是四个字节来指定地址。例如,如果我想访问地址为 0xFF9134 的内存:
lea (0x9134).w, a0
< sign extension >
lea (0xFFFF9134).l, a0
< discard high byte >
lea 0xFF9134, a0
我遇到的问题是 IDA Pro 正在执行符号扩展,但随后会考虑整个 32 位地址而不是仅低 24 位。 IDA 最终会尝试交叉引用不存在(或至少不应该存在)的地址,而我在 0xFF8000-0xFFFFFF 地址范围内的任何段/代码/数据都会被完全忽略。
我还是 IDA Pro 的新手,所以我不知道这是否可以通过脚本解决,更不用说如何编写这样的东西了。有没有办法让反汇编程序正确处理这个肮脏/聪明的寻址技巧?
【问题讨论】:
-
对于原作者来说,这是一些令人印象深刻的优化。酷。
-
也许你可以只复制内存范围 0xFF8000 - 0xFFFFFF 到 0xFFFF8000,所以 IDA Pro 在这两个地方都可以找到它。
-
不太酷。这样的代码不能移植到 32 位 030 或 040 的……不好的做法。但在当时,这些都是提高速度的常见技巧。自我修改代码是另一回事。但在 ROM 中,它并不能很好地工作;)