代码之家  ›  专栏  ›  技术社区  ›  Shane

为什么需要使用操作码LD A,A[[副本]

  •  0
  • Shane  · 技术社区  · 6 年前

    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 执行。

    为什么指令集中包含这些操作码?它们有什么用途?

    0 回复  |  直到 5 年前
        1
  •  15
  •   Ped7g    6 年前

    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 ,不确定从快速的一瞥,如果我破译它完美。

    人们也会期待 76 成为 LD (HL),(HL) ,这比 LD A,A HALT 相反。

    因此,它是关于指令解码器的简单性,使用相同的位模式来选择源/目标寄存器,以及关于不添加更多的晶体管来捕捉信号 same,same 情况,除了 (HL),(HL)

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

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


    补遗:最近我读到关于俄罗斯辛克莱ZX频谱克隆,这是严重修改的机器,增加额外的权力,内存和能力。。。他们中的一些人正在使用这些 ld same,same nop 可能无法正常执行。这与GameBoy无关,但如果你有二进制目标的“sprint”或类似的俄罗斯ZX克隆之一,你发现其中一个在反汇编,不要考虑他们自动 没有 ,它们可能是实际执行某些操作的有效代码的一部分(很可能是DMA)。

        2
  •  5
  •   Peter Camilleri    6 年前

    这些奇怪的NOP指令一直追溯到最初的祖先处理器intel8008,在该芯片中,它们仅仅是寄存器移动指令实现的结果。允许mova、A等简化了指令译码器,节省了硅空间。

    从8080到Z80(以及更高版本),这些都是保持向后兼容性所必需的。它们甚至以这种形式存活到x86世界

    移动铝、铝等。

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

    注意:我在描述英特尔机器时使用了英特尔助记符。请确保这些代码与Zilog助记符组装成相同的二进制代码。

    推荐文章