【发布时间】:2019-01-30 03:39:31
【问题描述】:
我正在编写一个chip-8 解释器。我有我的模拟硬件、指令执行、UI 等。一切都很好,所以我开始实际加载和执行真正的chip8 程序。
在我在网上找到的 zip 存档中,有几款游戏似乎有非法跳转调用。
来自CowGod's specification 它说:
所有指令都是 2 个字节长并且首先存储最高有效字节。在内存中,每条指令的第一个字节应该位于偶数地址。如果程序包含精灵数据,则应对其进行填充,以便后面的任何指令都正确地位于 RAM 中。
这似乎非常坚持,不可能有一条从奇数内存地址执行的指令,因此我将我的解释器编码为失败是我们最终试图转到一个奇数内存地址(主要是因为我假设我“如果发生这种情况,我会读错)。
然而,我包中的两个游戏(INVADERS 和 BLITZ)似乎立即以跳转调用开始(他们用 ascii 中的名称签署了 rom,所以第一条指令是调用跳转之后签名。
前者以0x12 0x25 开头,后者以0x12 0x17 开头。这两个都指向对奇数地址(分别为 0x225 和 0x217)的跳转调用,然后在我的模拟器中失败。查看它们指向的那些地址,它们看起来像是包含有效指令(前者中的字节 25 包含 0x6000 (LD V0, 00),而后者中的字节 17 指向 0xA341 (LD I, 341)。
我是不是对规范解释得太严格了,预计实际应用程序不会被填充并且可以在奇数地址上运行?
【问题讨论】:
-
如果程序从奇数地址开始,那么后面的每条指令是否也在奇数地址?
-
在大多数情况下,它是每一个奇怪的假设,但我没有深入研究它以确保将指令与精灵数据分开
-
我查看了规范,对我来说,您引用的这句话更像是建议而不是要求。它使用“应该”这个词而不是“必须”。虚拟机在读取未对齐的指令时中止没有任何事情。规范说 1nnn 跳转到 nnn 没有以任何方式限定 nnn。
-
在我看来,只有 4K 内存的 8 位架构不太关心指令对齐。最后,如果架构对对齐很认真,则可以优化一些指令。例如,Bnnn 指令的范围可以通过在跳转前将 V0 值左移来加倍。但显然没有这样的优化。
-
牛神的规格不是很准确。一方面,它延续了几个操作码的 SCHIP 实现,这与原始的 COSMAC VIP 规范不同。这种将指令限制为从偶数字节开始的奇怪限制似乎是另一个问题。我遇到的任何口译员都没有这样的限制。
标签: chip-8