【问题标题】:Z80 division algorithm not functioning properlyZ80 除法算法无法正常运行
【发布时间】:2021-12-24 02:25:42
【问题描述】:

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

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(?)

发生了什么事?任何帮助将不胜感激,感谢您的宝贵时间。

【问题讨论】:

    标签: math assembly z80


    【解决方案1】:

    您的代码的问题在于 $+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
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2020-12-07
      • 1970-01-01
      • 2021-04-22
      • 2015-12-08
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多