【问题标题】:Z80: How to add 16 and 8 bit registers?Z80:如何添加 16 位和 8 位寄存器?
【发布时间】:2011-01-15 21:58:48
【问题描述】:

如何将 16 位和 8 位寄存器与进位相加(例如 HL 和 A)?

【问题讨论】:

  • 天啊。自从 1980 年左右将机器代码插入 Sinclair ZX-80 REM 语句以来,我没有做过任何 Z80 编程。我的损失,直到今天,它仍然是完成某些任务的出色处理器。不知道,也许这会有所帮助:nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/…
  • +1 只是因为它是一个 z80 问题。美好时光。
  • 嘿......自从 Spectrum 之后也没有碰过它(更喜欢它而不是寄存器饥饿的 6502)。卡尔编辑的答案与我记得的一样,虽然我现在不能投票,因为已经对 BC 订单问题进行了投票。嗯嗯。
  • ZX-80?你们娘娘腔!我有一个 TRS-80 Model I Level II,有完整的 16KB 内存! :-)

标签: assembly z80


【解决方案1】:

我想指出,检查过的回复(由 Carl Norum)是正确的,但不是最佳答案。 下面显示了两种策略与时钟周期的速度。 使用正确的解决方案可以节省时间,并且不会破坏第二个 16 位寄存器对。

  4   ld c,a            4   add a,l
  7   ld b,0            4   ld l,a
  11  add hl,bc         4   adc a,h
                        4   sub l
                        4   ld h,a

但是,右边的解决方案确实需要额外的代码字节。

【讨论】:

  • 我不同意“最快=最好”的说法。在此类机器上,内存通常是一种昂贵的资源。因此“多使用一个字节”是一个重要的缺点。 OTOH,“保存一个寄存器”参数是一个不错的参数。由 OP 来选择
  • 好点。我应该说“不是必然最好的答案”。
  • 寄存器可能是一个非常宝贵的资源,所以不使用另外两个额外的寄存器也是一个很大的胜利。
【解决方案2】:

你不能直接做。您需要将 A 复制到 16 位寄存器对中,然后进行添加:

LD  B, 0
LD  C, A
ADC HL, BC

【讨论】:

  • 是的,我认为这可行.. 但不应该 B 为 0,C 为 A,而不是相反吗? (现在等待它不再起作用,因为 'ld bc, a' 无效)
  • 是的,很有可能。抱歉,我不记得我头顶上的正确顺序。编辑回来。
  • 我以为你想要Carry?
  • C 保存低字节,B 保存高字节。所以,是的,B 应该是零。
  • 为了后代:确保将其与 James 的答案进行比较(add a,l \ ld l,a \ adc a,h \ sub l \ ld h,a)更快(20 个周期 BC += A 或DE += A),但要长一个字节。
【解决方案3】:

来自http://nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/opcodes.html

Add Byte with Carry-In Instructions
8080 Mnemonic Z80 Mnemonic  Machine Code Operation
ADC  M        ADC A,(HL)    8E           A <- A + (HL) + Carry

【讨论】:

  • 这是将 8 位内存位置的内容添加到 8 位累加器 A。
  • (HL) 表示 HL 指向的字节地址的 contents,不过……我不认为这就是 OP正在尝试做。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多