【问题标题】:Z80 assembly: How to add signed 8-bit value to 16-bit register?Z80 汇编:如何将带符号的 8 位值添加到 16 位寄存器?
【发布时间】:2018-03-02 14:17:11
【问题描述】:

我编写了一个 Z80 反汇编程序,可以从我的 SBC 中的 ROM 运行。我需要做的最后一件事(除了尚未发现的错误)是转换相对地址并将它们作为绝对地址输出,这样当反汇编程序遇到五个 JR 操作码变体之一时,它会显示绝对地址JR操作码指向。

JR 操作码变体使用 8 位偏移值来告诉 Z80 跳转到内存中的哪个位置。偏移量是单个有符号 (-128 127) 字节,我需要将其添加到 HL 寄存器中的当前内存位置以获得绝对地址。

不过,我的大脑似乎遇到了严重的语法错误,甚至可能被零除,因为我一生都无法弄清楚如何将 8 位有符号(或 2 的补码)字节添加到16 位寄存器获取绝对地址。已经搜索了互联网,没有答案。

任何人都可以提出解决方案或指出正确的方向吗?

【问题讨论】:

  • 第一次谷歌点击:wikiti.brandonw.net/…
  • 符号扩展到 16 位,然后照常进行添加。
  • HansPassant,我已经看过该页面,但不明白任何示例如何应用于我的特定问题。另一方面,@Jester 提供了一些有用的信息。
  • @Jester - 完美,效果很好。为什么不将其作为答案提交,我可以相应地标记它?
  • hmm 在那个页面上我看到了一个如何将符号扩展到 16 位的示例

标签: math assembly z80


【解决方案1】:

最简单的方法是将 8 位值符号扩展为 16 位,然后使用 16 位加法。这是一些执行此操作的代码。 A 是 8 位有符号值,HL 是 8 位有符号值将添加到的 16 位基址。结果为HL

   LD  E,A
   ADD A,A      ; sign bit of A into carry
   SBC A,A      ; A = 0 if carry == 0, $FF otherwise
   LD  D,A      ; now DE is sign extended A
   ADD HL,DE

还请记住,对于JR,偏移量是相对于指令之后的地址,而不是JR 指令本身的地址。

【讨论】:

  • 谢谢@GeorgePhillips - 从技术上讲,小丑是第一个给出正确答案的人,但你的答案是第一个实际答案,它包括对应用于地址 JR 之后的偏移量的引用操作说明。不知道反对票是怎么回事 - 我认为这是一个合理的问题。
  • 我也不明白。这是一个具体的问题,如果你以前没有做过,我认为答案不是微不足道的。我也倾向于打折谷歌点击,因为即使他们有确切的答案,也不意味着可以找到答案。当然,“符号扩展”似乎很容易,但前提是您知道该术语。 “乞求问题”的原始含义的一个典型例子。
猜你喜欢
  • 2011-01-15
  • 2017-04-14
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多