Z80的BCD减法程序
BCD subtraction program for the Z80
本程序摘自Programming the Z80一书,本程序的目的是做x字节的BCD减法,x可以是任意整数,就是通过计数两个操作数的字节数并通过循环执行减法指令,但这里我们假设这两个数具有相同的字节数,我们将其称为COUNT
。这些号码的地址是 N1
和 N2
以及后面的地址。我的问题在代码的注释中。
BCDPAK LD B, COUNT
LD DE, N2
LD HL, N1
AND A ;Clear carry
MINUS LD A, (DE)
SBC A, (HL)
DAA ;Decimal adjust the result
LD (HL), A ;Store the result in HL
INC DE
INC HL ;Doesn't that overwrite the result?
DJNZ MINUS ;Decrement B, loop until B = 0
结果存放在HL指向的地址,然后HL(即指针)递增指向减数和结果的下一个字节。
请注意,结果会覆盖减数而不是被减数,大多数汇编指令通常会发生这种情况。例如。 SBC A, (HL)
将从 A 中减去 (HL) 并将结果保留在 A。但是,此例程将从 DE 指向的数字中减去 HL 指向的数字,并将结果保留在 HL 最初指向的内存位置而不是 DE
本程序摘自Programming the Z80一书,本程序的目的是做x字节的BCD减法,x可以是任意整数,就是通过计数两个操作数的字节数并通过循环执行减法指令,但这里我们假设这两个数具有相同的字节数,我们将其称为COUNT
。这些号码的地址是 N1
和 N2
以及后面的地址。我的问题在代码的注释中。
BCDPAK LD B, COUNT
LD DE, N2
LD HL, N1
AND A ;Clear carry
MINUS LD A, (DE)
SBC A, (HL)
DAA ;Decimal adjust the result
LD (HL), A ;Store the result in HL
INC DE
INC HL ;Doesn't that overwrite the result?
DJNZ MINUS ;Decrement B, loop until B = 0
结果存放在HL指向的地址,然后HL(即指针)递增指向减数和结果的下一个字节。
请注意,结果会覆盖减数而不是被减数,大多数汇编指令通常会发生这种情况。例如。 SBC A, (HL)
将从 A 中减去 (HL) 并将结果保留在 A。但是,此例程将从 DE 指向的数字中减去 HL 指向的数字,并将结果保留在 HL 最初指向的内存位置而不是 DE