寄存器返回高于它的十六进制值1(8085汇编)

时间:2015-06-19 02:23:23

标签: assembly 8085

我正在为计算机工程课程的介绍工作。我正在尝试编写一个从用户输入数字的子程序,然后在H寄存器中返回这个数字。

从我所看到的情况来看,单个数字输入可以正常工作,但是当我尝试继续并添加另一个时,它会在H寄存器中返回(输入#)+ 1。

输入不会超过两个字符,且不会超过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 个答案:

答案 0 :(得分: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,因此您将获得{{1} }}。要么循环运行9次,要么从归零累加器开始。

PS:学会使用调试器。