私はコンピューター工学クラスの入門の課題に取り組んでいます。ユーザーからの数値入力を受け取り、この数値を H レジスターに返すサブルーチンを作成しようとしています。
私が見る限り、1 桁の入力では正常に動作しますが、続行して別の入力を追加しようとすると、H レジスタに (input #)+1 が返されます。
入力は 2 文字を超えず、20 文字を超えません。
readN: ; This subroutine reads a number digit from the user
; and returns this number in H
; Inputs: none
; Outputs: H register
push b
push psw
push h ; store registers in stack
mvi b,0 ; Zero out the B register
lxi d,mess4 ; "Enter number: $"
call bdos ; bdos = 0005
nextN: mvi c,1 ; C = 1 --> Read character
call bdos
cpi cr ; cr = 0Dh (carriage return)
jz lastN ; if input was carriage return --> go to lastN
mvi h,10 ; set up H register for multiplication
sui '0' ; subtract ASCII 0 from input, leaving the numerical value
mov e,a ; store accumulator in E register
mov a,b ; bring B register (existing number) to accumulator
mult: add b
dcr h ; decrements multiplication tracker
jnz mult ; if h != 0 --> redo addition
add e ; add E register (new input) to old input*10
mov b,a ; store result in b
jmp nextN ; redo input
lastN: pop h
mov h,b
pop psw
pop b
ret
ここで私が間違っているかもしれないことを誰かが見ることができますか? すべてを提供したことを願っていますが、コードで何かを解決する必要がある場合はお知らせください.
ありがとう!