Регистр, возвращающий шестнадцатеричное значение на 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: научитесь пользоваться отладчиком.

Другие вопросы по тегам