Z80 除法算法无法正常运行

Sha*_*des 8 math assembly z80

我正在尝试运行以下代码:

HLDIVC: 
    LD B,16
D0: XOR A
    ADD HL,HL
    RLA
    CP C
    JR C, D1
    INC L
    SUB C
    DJNZ D0
D1: RET
Run Code Online (Sandbox Code Playgroud)

这是原始代码的改编:(在这里找到)

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
Run Code Online (Sandbox Code Playgroud)

在我有的一台旧袖珍电脑上。我必须稍微编辑一下代码,因为这台袖珍计算机上的汇编器似乎根本不支持“jr c,$+4”语法,而必须使用标签或绝对地址。然而,这似乎可能会引起问题,因为该算法似乎无法正常工作。我使用以下代码调用该函数:

ORG O100H
LD HL,20
LD C,10
CALL REGOUT; Display all register values
CALL HLDIVC
CALL REGOUT
RET
Run Code Online (Sandbox Code Playgroud)

有了这个,我试图将 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 |
Run Code Online (Sandbox Code Playgroud)

(所有值均为十六进制)

运行程序后,这些是寄存器值:

| 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(?)
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?任何帮助将不胜感激,感谢您的宝贵时间。

Tim*_*rts 6

您的代码的问题在于 $+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
Run Code Online (Sandbox Code Playgroud)