【发布时间】: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(?)
发生了什么事?任何帮助将不胜感激,感谢您的宝贵时间。
【问题讨论】: