Как преобразовать введенное пользователем 16-битное число в десятичное - PullRequest
3 голосов
/ 15 апреля 2019

Я заставил пользователя ввести 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 Ответ

3 голосов
/ 16 апреля 2019

Сначала получите правильное значение для ввода.

После того, как вы получили 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

Затем выведите на экран.

Я хочуотобразите число, введенное пользователем.

Переместите 16-разрядное число, сохраненное в BX (из предыдущих шагов), в регистр AX, а затем прочитайте мои объяснения о том, как преобразовать16-разрядное число в AX в тексте, чтобы его можно было распечатать на экране в Отображение чисел с помощью DOS .


...