Z80:从栈顶复制到 HL

Z80: Copying from Top of Stack to HL

这可以通过以下方式完成:

11 pop hl
10 push hl

在 21 个周期内。我发现的唯一替代方案是 ex (sp),hl,它需要 19 个周期。缺点是内容必须在我处理完后才能恢复到原来的值,所以在实践中,这种方法比第一种方法更昂贵。

还有其他选择吗?

如果您想将堆栈顶部的值放入 HL,那么您已经列出了几乎所有可用选项:

          pop hl : push hl                               ; 10+11 = 21t

          pop hl : dec sp : dec sp                       ; 10+6+6 = 22t

你也可以做self-modified代码,这不会有太大好处:

          ld (addr1+1),sp
addr1:    ld hl,(0)                                      ; 20 + 16 = 36t

更别扭的是,可以先把SP弄成HL:

          ld hl,0 : add hl,sp
          ld a,(hl) : inc hl : ld h,(hl) : ld l,a        ; 10+11 + 7+6+7+4 = 21+24 = 45t

(我提到了最后两个选项,以防万一在您的情况下您可以以某种方式从其中一个中受益。)

命令

          ex (sp),hl                                     ; 19t

用HL的当前值交换栈顶的值,所以已经不是你要的了(虽然很快)。因此,进一步加快速度的唯一方法就是以各种方式作弊。有一些看似最明显的作弊方法:

  • 如果你真的知道 SP 指的是哪里,简单地阅读它会更快:

         ld hl,(wherethestackis)                         ; 16t
    
  • 如果你能控制堆栈的确切位置,或者堆栈实际包含什么,你可以将它指向将值加载到 HL 的命令,这样你就可以简单地做

         ld hl,thevalueonthestack                        ; 10t
    

我知道这两个选项看起来都很极端,但我知道很多高度优化的 Z80 代码都受益于类似的技巧。所以,请不要直接解雇他们。