如何确定目标文件中指令的开始和结束?

时间:2014-07-24 22:38:58

标签: disassembly emulation z80

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

我正在尝试解析每条指令的操作码,但我发现它并不像每条指令后都有换行符。那么这是怎么发生的呢?对我来说,它只是看起来像一堆字节,无法分辨操作码和操作数之间的区别。

2 个答案:

答案 0 :(得分:5)

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

也就是说,您必须对指令进行解码才能确定它的持续时间。

答案 1 :(得分:2)

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

为了获得一个完整的反汇编程序,大多数人都会对一些温和的模拟进行估算,递归跟踪流程。找到说明,然后扣除数据。

与GB相比,GB存储空间很大(相比之下)并且盗版存在物理障碍,但在其他平台上,通过将代码写入分支中来节省空间或实现反汇编代码是相当常见的。操作码的中间将创建多路复用的第二操作流,或者通过突然将有效数据重用为有效代码可以实现相同的操作。奥兰多6502的努力之一甚至重新使用了一些加载器文本 - 常规ASCII - 作为解密代码。这种东西很难破解,因为它没有简单的装配,因此反汇编程序通常无法找出启发式的方法。相反,在一个适当准确的模拟器上,这样的代码应该完全像原来那样工作。