我正在嘗試運行以下代碼:
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(?)
這是怎么回事?任何幫助將不勝感激,感謝您的時間。
uj5u.com熱心網友回復:
您的代碼的問題在于 $ 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392649.html
上一篇:回傳值Vs參考(在匯編中)
