【问题标题】:What's the purpose of instructions for loading a register to itself?将寄存器加载到自身的指令的目的是什么?
【发布时间】: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


【解决方案1】:

它们简化了解码单元,如果你愿意检查的话

7F LD A,A
78 LD A,B
79 LD A,C

47 LD B,A
40 LD B,B
41 LD B,C

4F LD C,A
48 LD C,B
49 LD C,C

您可以注意到,底部 3 位是为源寄存器保留的(值 0-7 转到 B,C,D,E,H,L,(HL),A),它们旁边的 3 位是目标寄存器,同样具有相同的 0-7 含义(因此 0 对 0创建LD B,B),而前两位01 选择LD,不知道我是否完美地破译了它。

人们还期望76LD (HL),(HL),这比LD A,A 更没有意义,所以有特殊的逻辑可以捕捉到那个并改为HALT

所以它是关于指令解码器的简单性,使用相同的位模式来选择源/目标寄存器,并且关于不添加更多晶体管来捕捉same,same 情况,除了(HL),(HL)(这可能会在两者内部都失败源和目标需要内存访问,所以在硬件设计中,额外的“逻辑”可能相当简单。

请记住,早期的 CPU 通常是手工设计的,并且晶体管的总数量必须保持在较低的水平,以适应芯片,并便于手工绘制电路并验证其正确性。

编辑:Z80 有大约 8500 个晶体管,您可能需要检查:https://en.wikipedia.org/wiki/Transistor_counthttps://en.wikipedia.org/wiki/Zilog_Z80 ... GameBoy 对 Z80 进行了一些修改,但晶体管总数将非常接近原始价值,虽然我没有寻找确切的价值,而且我不确定任天堂会将它扩展到多远的未来,也许他们已经可以负担得起 20-50k 的价格,但我对此表示怀疑。


附录:最近我读到了关于俄罗斯 Sinclair ZX Spectrum 克隆的文章,它们是经过大量修改的机器,增加了额外的功率、内存和功能......其中一些正在使用这些 ld same,same 操作码来控制 DMA 传输,所以在这些机器上使用它们作为nop 的代码可能无法正确执行。这与 GameBoy 无关,但如果您将二进制目标定位为“Sprinter”或类似的俄罗斯 ZX 克隆之一,并且您在反汇编中发现其中之一,请不要自动考虑它们nop,它们可能是有效的一部分代码实际上在做某事(很可能是使用 DMA)。

【讨论】:

    【解决方案2】:

    这些奇怪的 NOP 指令可以追溯到最初的祖先处理器 Intel 8008。在那个芯片中,它们只是执行寄存器移动指令的结果。允许 MOV A、A 等简化了指令解码器并节省了芯片空间。

    从 8080 到 Z80(及更高版本),这些成为保持向后兼容性所必需的。他们甚至以

    的形式在 x86 世界中幸存下来

    MOV AL,AL 等

    所以大多数现代台式机仍然支持这些奇怪的指令。

    注意:我在描述 Intel 机器时使用了 Intel 助记符。请放心,这些组合成与 Zilog 助记符相同的二进制代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2019-04-16
      • 2020-07-13
      相关资源
      最近更新 更多