Z80汇编:如何将有符号的8位值添加到16位寄存器?



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

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

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

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

最简单的方法是将 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指令本身的地址。

最新更新