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

noc*_*boy 5 math assembly z80

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

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

我的大脑似乎正在遭受严重的语法错误,甚至可能被零除,因为我不能为我的生活找出如何将一个8位带符号(或2的补码)字节添加到16位注册以获取绝对地址.已经搜索了互联网,没有答案即将到来.

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

Geo*_*ips 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
Run Code Online (Sandbox Code Playgroud)

还要记住,因为JR偏移量是相对于指令之后的地址,而不是JR指令本身的地址.