Принимая в качестве входных данных 16-битное число и отображая его на экране - PullRequest
2 голосов
/ 20 апреля 2019

Я должен принять 16 бит в качестве входа как 1234 и попытался отобразить его. Но он выдает 4660. Я пытался сохранить цифру за цифрой, потому что когда я беру ввод, он будет сохранен в al как в форме ASCII. После этого я попытался сдвинуть весь бит в al влево, используя операцию сдвига влево (SHL), которая даст мне 10 в al, если я вставил 1. После этого я вставил вторую цифру и выполнил сдвиг и поворот Я попытался сделать это в форме 02, если вторая сохраненная цифра равна 2. Далее я выполнил OR операцию с 10 и 02, которые хранятся в регистре. Я повторил тот же процесс для хранения младшего 8-битного числа. Но вывод другой.

.model small
.stack 100h
.data

.code
    main proc
    mov ax,@data
    mov ds,ax

    ;taking 16 bit number input
    mov ah,01h
    int 21h
    mov bh,al
    mov cl,4
    shl bh,cl

    mov ah,01h
    int 21h
    mov cl,4
    shl al,cl
    mov cl,4
    ror al,cl
    or bh,al

    mov ah,01h
    int 21h
    mov bl,al
    mov cl,4
    shl bl,cl

    mov ah,01h
    int 21h
    mov cl,4
    shl al,cl
    mov cl,4
    ror al,cl
    or  bl,al
    ;taking 16 bit number input


    ;displaying number in dos
    mov     ax,bx
mov     bx,10         
    xor     cx,cx          
  .a: 
    xor     dx,dx          
    div     bx             
    push    dx             
    inc     cx             
    test    ax,ax          
    jnz     .a             
 .b: 
    pop     dx             
    add     dl,"0"         
    mov     ah,02h         
    int     21h            
    loop    .b
exit:
   mov ah,4ch
   int 21h
   main endp
   end main

1 Ответ

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

После преобразования цифр ASCII в целое число вы упаковываете 4-битные полубайты в BCD (Bindary Coded Decimal) вместо умножения на десятичные значения-места (степени 10), чтобы получитьдвоичное целое число.

4660 (десятичное число) = 0x1234 , поэтому вы правильно реализовали упаковку BCD, но это не то, что вы хотите сделать в первую очередь.

Слева-смещение на 4 эквивалентно умножению на 16, а не на 10.

Сборка NASM преобразует ввод в целое число? для строки-> двоичное целое число с использованием стандартного
total = total*10 + digit алгоритм , начиная с самой значимой цифры.

Этот вопрос и ответ имеет 32-битный код, но сам алгоритм достаточно прост для реализации, как только вы его поймете.Или вы можете искать другие вопросы и ответы по переполнению стека (например, с помощью Google, если встроенный поиск не помогает) с 16-битным кодом.

...