【问题标题】:M68k - IDA Pro 24-bit addressing?M68k - IDA Pro 24 位寻址?
【发布时间】:2015-06-22 18:22:36
【问题描述】:

我正在尝试反汇编 68000 的 BIOS 映像,但我无法让 IDA Pro 6.5 正确交叉引用地址。

对于那些不知道的人,摩托罗拉 68000 有几个与寻址相关的有趣功能/怪癖:

  1. 当给定一个 16 位绝对地址时,处理器会在取消引用之前将其符号扩展为 32 位。
  2. 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 中,它并不能很好地工作;)

标签: ida 68000


【解决方案1】:

我也有同样的问题。我的决定是创建 custom_ana 回调,然后将每个操作数地址更改如下:op.add &= 0xFFFFFF。 但这并不容易。因为此时你还没有完全识别“cmd”,必须自己编写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2012-09-28
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多