我试图运行以下代码:
HLDIVC:
LD B,16
D0: XOR A
ADD HL,HL
RLA
CP C
JR C, D1
INC L
SUB C
DJNZ D0
D1: RET这是对原始代码的改编:(找到了在此)
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“语法,而必须使用标签或绝对地址。然而,这似乎会引起问题,因为算法似乎没有正常工作。我使用以下代码调用该函数:
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(?)到底怎么回事?任何帮助都将是非常感谢的,谢谢您的时间。
发布于 2021-12-24 03:16:08
代码的问题是,$+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
REThttps://stackoverflow.com/questions/70469035
复制相似问题