【问题标题】:How do I determine the start and end of instructions in an object file?如何确定目标文件中指令的开始和结束?
【发布时间】:2014-09-16 16:26:35
【问题描述】:

所以,我一直在尝试编写一个模拟器,或者至少了解它是如何工作的。我对汇编有很好的了解,尤其是 z80 和 x86,但我从来没有真正理解过目标文件(或者在我的情况下是 .gb ROM 文件)如何指示指令的开始和结束。

我正在尝试解析每条指令的操作码,但我突然想到每条指令后都没有换行符。那么这是怎么发生的呢?在我看来,它只是一堆字节,无法区分操作码和操作数。

【问题讨论】:

    标签: disassembly emulation z80


    【解决方案1】:

    对于大多数 CPU - 我相信 Z80 属于这一类 - 指令的长度是隐含的。

    也就是说,您必须对指令进行解码才能确定它有多长。

    【讨论】:

    • 好的,这实际上很有意义。但是我怎么知道某事是指令还是数据?那只是基于文件的地址空间吗?
    • 唉,不。您必须分析代码并查看控制流是否可以到达特定地址以确定它是否是代码。
    • 非常感谢。你能不能指点我读一些关于这样做的书? :)
    • 不是我的头,但我相信有些书涵盖了反汇编的主题,这基本上就是这个。
    【解决方案2】:

    如果您正在编写一个模拟器,那么您实际上并不需要能够获得完整的反汇编。你知道程序计数器现在是什么,你知道你是否期待一个新的操作码、一个地址、一个 CB 页面操作码或其他任何东西,你只需处理它。实际上,人们最终编写的通常是每个操作码的递归下降解析器。

    为了得到一个完整的反汇编程序,大多数人会进行一些温和的模拟,递归地跟踪流程。找到指令,扣减数据。

    在存储空间充足(相比之下)且盗版存在物理障碍的 GB 上并没有那么多,但在其他平台上,通过在分支到一个操作码的中间会创建一个多路复用的第二个操作流,或者通过突然将有效数据重用为有效代码来实现同样的事情。 Orlando 的 6502 项目之一甚至重新使用了一些加载器文本(常规 ASCII)作为解密代码。这种东西很难破解,因为没有简单的组装,因此反汇编程序通常无法启发式地弄清楚要做什么。相反,在适当精确的模拟器上,这样的代码应该完全按照它原来的方式工作。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2021-04-15
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多