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

时间:2019-04-15 17:21:14

标签: assembly x86-16

我让用户输入一个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。你们可以让我知道我做错了什么吗,请帮帮我?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

首先正确输入。

一旦您从输入中获得了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

然后输出到屏幕。

  

我要显示用户输入的号码。

将存储在BX中的16位数字(从先前的步骤)移至AX寄存器,然后阅读我对如何转换AX中的16位数字的解释变成文本,以便可以将其打印到屏幕上的Displaying numbers with DOS