如果您检查,它们会简化解码单元。
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
你会注意到,底部的三位用于保留源寄存器(值为0-7,对应B,C,D,E,H,L,(HL),A
),然后是3位目标寄存器,再次具有相同的0-7含义(因此0与0创建LD B,B
),而顶部的两个位01
选择了LD
指令,快速浏览时不确定是否完全解密。
因此,人们也会期望76
代表LD (HL),(HL)
,这甚至比LD A,A
更没有意义,因此需要特殊逻辑来捕获该指令并执行HALT
。
所以这就是指令译码器简单化的问题,使用相同的位模式来选择源/目标寄存器,并且不添加更多的晶体管以避免处理同一寄存器的情况,除了(HL),(HL)
(可能在内部在源和目标上都失败,需要访问内存,因此硬件设计中的额外“逻辑”可能非常简单)。
请记住,早期的CPU通常是手工设计的,必须保持总晶体管数量较低,以便适合芯片并且可以手工绘制电路并验证其正确性。
编辑:Z80大约有8500个晶体管,您可以查看:https://en.wikipedia.org/wiki/Transistor_count和https://en.wikipedia.org/wiki/Zilog_Z80... GameBoy有一个稍微修改过的Z80,但是总晶体管数量将非常接近原始值,尽管我没有搜索确切的值,并且我不确定任天堂向未来扩展了多少,也许他们甚至可以负担起像20-50k这样的东西,但我怀疑。
补充说明:最近我阅读了有关俄罗斯Sinclair ZX Spectrum克隆机的文章,它们是经过大量修改的机器,添加了额外的功率、内存和功能...其中一些使用这些ld same,same
操作码来控制DMA传输,在这些机器上,使用它们作为nop
的代码可能无法正常执行。虽然这与GameBoy无关,但如果您面向其中之一的“Sprinter”或类似的俄罗斯ZX克隆机的二进制目标,并且在反汇编中发现其中之一,请不要将其自动视为nop
,它们可能是实际执行某些操作的有效代码(最有可能是与DMA相关的)。
NOP
操作码是0x00
,其他所有操作码都是唯一的。这里是列表。 - Spooze00
设为NOP
是很重要的:在一些机器如ZX80中,视频逻辑通过强制数据总线低电平来使CPU执行NOP
指令作为地址生成器。 - Stefan Paul Noack