Z80 除法算法无法正常运行
Z80 division algorithm not functioning properly
我正在尝试 运行 以下代码:
HLDIVC:
LD B,16
D0: XOR A
ADD HL,HL
RLA
CP C
JR C, D1
INC L
SUB C
DJNZ D0
D1: RET
编辑:(http://z80-heaven.wikidot.com/math#toc18) 的原始代码是:
HL_Div_C:
;Inputs:
; HL is the numerator
; C is the denominator
;Outputs:
; A is the remainder
; B is 0
; C is not changed
; DE is not changed
; HL is the quotient
;
ld b,16
xor a
add hl,hl
rla
cp c
jr c,$+4
inc l
sub c
djnz $-7
ret
在我的旧袖珍电脑上。我不得不稍微编辑一下代码,因为这台袖珍计算机上的汇编程序似乎根本不支持“jr c,$+4”语法,而是必须使用标签或绝对地址。然而,这似乎可能会导致问题,因为该算法似乎无法正常工作。我正在 运行 使用以下代码对其进行设置:
ORG O100H
LD HL,20
LD C,10
CALL REGOUT; Display all register values
CALL HLDIVC
CALL REGOUT
RET
用这个我试图将 20 除以 10,所以根据我的理解,调用函数后 HL 中的正确值应该是 2,A 中的值(余数)应该是 0。然而,情况并非如此。在 运行 执行 HLDIVC 程序之前,这些是寄存器值:
| PC = 0107 | AF = 00 44 |
| SP = 7FE8 | BC = 00 0A |
| IX = 7C06 | DE = 00 14 |
| IY = 7C0C | HL = 00 14 |
(所有值均为十六进制)
在程序 运行 之后,这些是寄存器值:
| PC = 010D | AF = 00 9B | <- A is correct
| SP = 7FE8 | BC = 10 0A | <- B is supposed to be 0
| IX = 7C06 | DE = 00 14 | <- DE is correct
| IY = 7C0C | HL = 00 14 | <- HL should be 2(?)
这是怎么回事?任何帮助将不胜感激,感谢您抽出宝贵时间。
你的代码的问题是 $+4 和 $-7 都是指字节数,而不是指令数,而且 JR 指令是 2 个字节。缩进给你一个线索。您需要移动标签:
HLDIVC:
LD B,16
XOR A
D0: ADD HL,HL
RLA
CP C
JR C, D1
INC L
SUB C
D1: DJNZ D0
RET
我正在尝试 运行 以下代码:
HLDIVC:
LD B,16
D0: XOR A
ADD HL,HL
RLA
CP C
JR C, D1
INC L
SUB C
DJNZ D0
D1: RET
编辑:(http://z80-heaven.wikidot.com/math#toc18) 的原始代码是:
HL_Div_C:
;Inputs:
; HL is the numerator
; C is the denominator
;Outputs:
; A is the remainder
; B is 0
; C is not changed
; DE is not changed
; HL is the quotient
;
ld b,16
xor a
add hl,hl
rla
cp c
jr c,$+4
inc l
sub c
djnz $-7
ret
在我的旧袖珍电脑上。我不得不稍微编辑一下代码,因为这台袖珍计算机上的汇编程序似乎根本不支持“jr c,$+4”语法,而是必须使用标签或绝对地址。然而,这似乎可能会导致问题,因为该算法似乎无法正常工作。我正在 运行 使用以下代码对其进行设置:
ORG O100H
LD HL,20
LD C,10
CALL REGOUT; Display all register values
CALL HLDIVC
CALL REGOUT
RET
用这个我试图将 20 除以 10,所以根据我的理解,调用函数后 HL 中的正确值应该是 2,A 中的值(余数)应该是 0。然而,情况并非如此。在 运行 执行 HLDIVC 程序之前,这些是寄存器值:
| PC = 0107 | AF = 00 44 |
| SP = 7FE8 | BC = 00 0A |
| IX = 7C06 | DE = 00 14 |
| IY = 7C0C | HL = 00 14 |
(所有值均为十六进制)
在程序 运行 之后,这些是寄存器值:
| PC = 010D | AF = 00 9B | <- A is correct
| SP = 7FE8 | BC = 10 0A | <- B is supposed to be 0
| IX = 7C06 | DE = 00 14 | <- DE is correct
| IY = 7C0C | HL = 00 14 | <- HL should be 2(?)
这是怎么回事?任何帮助将不胜感激,感谢您抽出宝贵时间。
你的代码的问题是 $+4 和 $-7 都是指字节数,而不是指令数,而且 JR 指令是 2 个字节。缩进给你一个线索。您需要移动标签:
HLDIVC:
LD B,16
XOR A
D0: ADD HL,HL
RLA
CP C
JR C, D1
INC L
SUB C
D1: DJNZ D0
RET