首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Z80除法算法不能正常工作

Z80除法算法不能正常工作
EN

Stack Overflow用户
提问于 2021-12-24 02:25:42
回答 1查看 141关注 0票数 8

我试图运行以下代码:

代码语言:javascript
复制
HLDIVC: 
    LD B,16
D0: XOR A
    ADD HL,HL
    RLA
    CP C
    JR C, D1
    INC L
    SUB C
    DJNZ D0
D1: RET

这是对原始代码的改编:(找到了在此)

代码语言:javascript
复制
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,$+4“语法,而必须使用标签或绝对地址。然而,这似乎会引起问题,因为算法似乎没有正常工作。我使用以下代码调用该函数:

代码语言:javascript
复制
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程序之前,以下是寄存器值:

代码语言:javascript
复制
| PC = 0107 | AF = 00 44 |
| SP = 7FE8 | BC = 00 0A |    
| IX = 7C06 | DE = 00 14 |    
| IY = 7C0C | HL = 00 14 |

(所有值均为十六进制)

运行程序后,以下是寄存器值:

代码语言:javascript
复制
| 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(?)

到底怎么回事?任何帮助都将是非常感谢的,谢谢您的时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-24 03:16:08

代码的问题是,$+4和$-7都是指字节计数,而不是指令计数,JR指令是2字节。压痕给了你一个线索。你需要移动标签:

代码语言:javascript
复制
HLDIVC: 
    LD B,16
    XOR A
D0: ADD HL,HL
    RLA
    CP C
    JR C, D1
    INC L
    SUB C
D1: DJNZ D0
    RET
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70469035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档