Z80:从堆栈顶部复制到 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

你也可以做自我修改的代码,这不会有太大的好处:

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 代码都受益于类似的技巧。因此,请不要立即驳回它们。

最新更新