【发布时间】:2018-10-15 16:39:26
【问题描述】:
在浏览 Gameboy 的指令集时,我发现了如下指令:
LD A, A
LD B, B
LD C, C
LD D, D
...
这些指令中的每一个在this table 中都有自己的操作码,由于可能的操作码数量的限制,这让我觉得它们很重要。
我首先认为它可能会取消引用该寄存器中的指针并将值存储在该指针 (like in this question) 中,但在 emulator 中,LD A, A 实现为:
Z80._r.a = Z80._r.a
它们似乎对处理器的状态没有影响(只需将寄存器设置为它们自己的值),并且执行的周期数与 NOP 相同。
为什么将这些操作码包含在指令集中以及它们的用途是什么?
【问题讨论】:
-
我猜他们的唯一目的是通过避免特殊情况使指令解码器更容易实现。有些位总是意味着
A,就是这样。 -
nop是否与其中一个操作码相同?在 x86 上,单字节 NOP 0x90 是单字节xchg-with-ax 短格式 0x90..0x97 的xchg ax,ax特例。 -
@PeterCordes 不,
NOP操作码是0x00,所有其他都是唯一的。 Here's a list -
为了澄清一点,在向后兼容的 eZ80 上,这些指令实际上是用于特殊目的(基本上是为了指示何时应该在其余的特殊模式下使用指令例行公事)。
-
@PeterCordes 让
00成为NOP很重要:在像 ZX80 这样的某些机器中,视频逻辑使用 CPU 作为地址生成器,只需强制数据总线为低电平以使 CPU 执行NOPs.
标签: assembly memory emulation z80 gameboy