使用 z80 asm 时,(HL) 和 (BC/DE) 之间有区别吗?

When using z80 asm is there a difference between (HL) and (BC/DE)?

在尝试为我的 TI-84 PlusCE 编写程序集的过程中,我遇到了一个奇怪的“错误”。考虑以下代码:

#include "includes\ti84pce.inc"

s_mem_start = saveSScreen

 .assume ADL=1
 .org userMem-2
 .db tExtTok,tAsm84CeCmp

 ;relevant portion
 ld HL, s_mem_start
 ld DE, 2
 ADD HL, DE
 ld D, H
 ld E, L

 ld A, (HL)
 call _PutC
 ld A, (DE)
 call _PutC
 ;/relevant portion

 ret

saveSScreen 是空闲内存的一部分。 _PutC 是一个 rom 调用,它将 A 的值打印到屏幕上。请参阅此图表:http://tibasicdev.wikidot.com/83lgfont。我已经确认 _PutC 不会影响任何寄存器。这段代码在屏幕上的输出是 v[CursorInsertSecond]。 (CursorInsertSecond 是计算器上的一个字符)。这些等同于十六进制 0373E5。分不清v是正体v还是斜体v

显然 (HL)(DE) 正在访问内存的不同部分。这在使用BC时也是一样的。奇怪的是我在任何地方都找不到记录的这些信息。仅使用一对寄存器来访问内存似乎是一个重大损害。确实让我自己的代码感觉很臃肿。

我注意到的最后一件奇怪的事情是,这似乎只适用于添加到 HL 时。考虑以下代码:(减去 header 部分)。

 ld HL, s_mem_start + 2
 ld DE, s_mem_start + 2

 ld A, (HL)
 call _PutC
 ld A, (DE)
 call _PutC

这导致输出 vv。这里会发生什么?为什么 (HL)(DE) 给出不同的输出,但只是在某些时候。

事实证明,ti84plusce 确实运行ez80 程序集。在 ez80 程序集中,HL、BC 和 DE 是三个字节而不是两个。我的代码只复制了两个字节,因此地址弄乱了。