我写过一个Z80反汇编程序,它在我的SBC中从ROM运行。我需要做的最后一件事(暂时尚未发现的错误)是转换相对地址并将它们作为绝对地址输出,这样当反汇编程序遇到五个JR操作码变体之一时,它会显示绝对地址JR操作码指向。
JR操作码变体使用8位偏移值来告诉Z80跳转到内存的哪个位置。偏移是单个有符号(-128< -127)字节,我需要将其添加到HL寄存器中的当前存储器位置以获得绝对地址。
我的大脑似乎正在遭受严重的语法错误,甚至可能被零除,因为我无法为我的生活找出如何将8位带符号(或2的补码)字节添加到a 16位寄存器获取绝对地址。已经搜索了互联网,没有答案即将到来。
有人能提出解决方案或指出我正确的方向吗?
答案 0 :(得分:10)
最简单的方法是将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
指令本身的地址。