这可以通过以下方式完成:
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 代码都受益于类似的技巧。因此,请不要立即驳回它们。