Регистр, возвращающий шестнадцатеричное значение на 1 больше, чем следует (сборка 8085)
Я работаю над заданием для моего вступления в класс компьютерной инженерии. Я пытаюсь написать подпрограмму, которая принимает число, введенное пользователем, а затем возвращает этот номер в регистр H.
Из того, что я вижу, он отлично работает с однозначными входами, но когда я пытаюсь продолжить и добавить еще один, он возвращает (input #)+1 в регистре H.
Входные данные не будут превышать двух символов и не будут превышать 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
Кто-нибудь может увидеть, что я могу делать здесь не так? Я надеюсь, что предоставил все, но дайте мне знать, если мне нужно что-то прояснить с кодом.
Спасибо!
1 ответ
Это происходит потому, что:
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
Вы заряжаете аккумулятор b
так что уже b*1
то ваш цикл запускается 10 раз и добавляет b*10
к нему, так что вы получите b*11
, Либо запустите свой цикл 9 раз, либо начните с обнуленного аккумулятора.
PS: научитесь пользоваться отладчиком.