Z80 程序集:如何将带符号的 8 位值添加到 16 位寄存器?
Z80 assembly: How to add signed 8-bit value to 16-bit register?
我编写了一个 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
指令本身的地址。
我编写了一个 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
指令本身的地址。