如何将用户输入的16位数字转换为十进制

How to convert a 16 bit number entered by user to decimal

我让用户输入一个 16 位数字。我想显示用户输入的号码。

这就是我到目前为止的想法。

如您所见,我已从输入中减去 30H 以将其转换为十进制。我应该在哪里添加 30H 以将其恢复为原始 ASCII 值?

        MOV AH,1H         ;user input for first number part 1 
        INT 21H 
        SUB AL,30H  
        MOV NUM1,AL

        MOV AH,1H         ;1st number part 2
        INT 21H           
        SUB AL,30H 
        MOV NUM2,AL  

        MOV AH,1H         ;1st number part 3
        INT 21H
        SUB AL,30H
        MOV NUM3,AL                         

        MOV AH,1H         ;1st number part 4
        INT 21H
        SUB AL,30H 
        MOV NUM4,AL

        XOR AH,AH                  
        MOV AL,NUM1       
        MOV DX,1000D
        MUL DX            ;1*1000
        ADD AH,30H
        ADD AL,30H
        MOV BX,AX        

        XOR AH,AH                  
        MOV AL,NUM2
        MOV DX,100D       
        MUL DX            ;2*100
        ADD BX,AX

        XOR AH,AH
        MOV AL,NUM3
        MOV DX,0010D
        MUL DX            ;3*10
        ADD AH,30H
        ADD AL,30H
        ADD BX,AX  

        XOR CH,CH
        MOV CL,NUM4
        ADD CH,30H
        ADD CL,30H
        ADD BX,CX       ;BX now has the 16 bit number


        MOV FNUM1,BX      ;final 1st 16 bit number


        PRINTN

        LEA DX,MSG8       ;msg for output
        MOV AH,9H
        INT 21H

        PRINT FNUM1

例如:当我输入数字 1234 时,我得到的输出是 F。你们能告诉我我做错了什么并帮助我吗?在这一点上,我们将不胜感激。

先把输入弄好

从输入中获得 4 位数字后,您需要按照公式
将它们组合起来 d1 * 1000 + d2 * 100 + d3 *10 + d4 在此计算中,您无需添加 48!

乘法*1000需要一个字大小的mul,但是乘以*100和*10可以用一个字节大小的mul

mov     al, NUM1
cbw                   ; -> AH=0
mov     dx, 1000
mul     dx            ; Product 1*1000 in DX:AX but with DX=0
mov     bx, ax        

mov     al, 100
mul     NUM2          ; Product 2*100 in AX
add     bx, ax

mov     al, 10
mul     NUM3          ; Product 3*10 in AX
add     bx, ax  

add     bl, NUM4
adc     bh, 0         ; BX now has the 16 bit number

上面的一个更好的版本使用了一个循环。仅当您将 NUMx 变量定义为内存中的连续字节时,此循环才有效!

NUM1 db 0
NUM2 db 0
NUM3 db 0
NUM4 db 0

...

    mov     cx, 4    ; Number of digits
    lea     si, NUM1 ; Address of 1st digit (most significant digit)
    xor     bx, bx   ; The 16-bit result
More:
    imul    bx, 10   ; BX = BX * 10
    lodsb            ; NUM1 then NUM2 then NUM3 then NUM4
    cbw
    add     bx, ax
    dec     cx
    jnz     More

然后输出到屏幕。

I want to display the number entered by the user.

BX中存储的16位数字(从前面的步骤)移动到AX寄存器中,然后阅读我对如何转换[=16中的16位数字的解释=] 到文本中,以便它可以在 Displaying numbers with DOS.

处打印到屏幕上