【问题标题】:When using z80 asm is there a difference between (HL) and (BC/DE)?使用 z80 asm 时 (HL) 和 (BC/DE) 有区别吗?
【发布时间】:2020-08-08 22:12:24
【问题描述】:

在尝试为我的 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 时。考虑这段代码:(减去标题部分)。

 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) 会给出不同的输出,但只是在某些时候。

【问题讨论】:

  • 我的猜测是_PutC 破坏了您在s_mem_start+2 的数据。也许它毕竟不是免费的 ram :) 如果您在第一个 _PutC 之前执行 (DE) 加载并推送值然后弹出它以进行第二次调用会发生什么?如果您先打印(DE),然后再打印(HL),会发生什么情况?
  • @Jester 无论我做什么组合,每个结果都是一样的。 ram 用于存储屏幕的备份,因此我发现它极不可能被覆盖。这也无法解释为什么第二段代码的工作方式不同。
  • 如图所示的第二个代码使用s_mem_start 而不是s_mem_start+2。那也许试试?
  • @Jester 没有骰子。两个 vs 而不是 ns。我会编辑问题来解决这个问题。

标签: assembly texas-instruments z80


【解决方案1】:

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

【讨论】:

  • 是的,不久前我们在this topic讨论过这个问题
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2013-01-05
  • 2021-08-30
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多