Не правильно выводит двоичное число - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите,пожалуйста. Суть кода ниже состоит в том, что он преобразует введенную строку, содержащую в себе число в двоичном в виде в нормальное двоичное число, но при попытке вывода его на экран через функцию OutBin добавляет к концу числа непонятный символ. Помогите понять почему. Заранее благодарен.
.MODEL SMALL
.STACK 200h
.386
 
.DATA
     string db 4 dup ('$')
     QName  db "Enter X: $"  
.CODE
.386
start:
    mov ax, @data
    mov ds, ax
    mov dx, offset Qname
    mov ah,09h
    int 21h
 
    mov ah, 0Ah
    mov dx, offset string
    int 21h
    call    Str2Num
    
Str2Num proc
    xor ax,ax
    mov cx,5
    mov si,0
    xor bx,bx
@m1:
    mov bl, string[si+1]
    sub bl,30h
    shl ax,4
    add ax,bx
    inc si
    dec cx
    cmp cx,0
    jne @m1
    cmp bx,'$'
    call OutBin 
    
    mov ax, 4c00h
    int 21h
Str2Num endp
OutBin proc
    mov bx,ax
    mov cx,3
ob1:
    shl bx,4
    jc ob2
    
    mov dl,'0'
    jmp ob3
    
ob2:
    mov dl,'1'
ob3:
    mov ah,2
    int 21h
    loop ob1
    
OutBin endp
 
end start

Решение задачи: «Не правильно выводит двоичное число»

textual
Листинг программы
.MODEL SMALL
.STACK 200h
.386
 
.DATA
     string db 17, 0, 17 dup ('$')
     QName  db "Enter X: $"
     CrLf   db 0Dh, 0Ah, '$'
 
     X      dw ?
.CODE
.386
start   proc
    mov ax, @data
    mov ds, ax
 
    mov dx, offset QName
    mov ah,09h
    int 21h
 
    mov ah, 0Ah
    mov dx, offset string
    int 21h
 
    mov ah, 09h
    lea dx, [CrLf]
    int 21h
 
    call    Str2Num
 
    mov [X], ax
 
    call ShowBin
 
    mov ax, 4c00h
    int 21h
start   endp
 
Str2Num proc
    lea si, [string+1]
    xor ax,ax
    xor cx, cx
    mov cl, [si]
    inc si
@m1:
    mov bl, [si]
    inc si
    sub bl, '0'
    shl ax, 1
    add ax, bx
    loop @m1
    ret
Str2Num endp
 
ShowBin proc
    mov bx,ax
    mov cx,16
ob1:
    shl bx, 1
    mov dl,'0'
    adc dl, 0
 
    mov ah,2
    int 21h
    loop ob1
 
    ret
ShowBin endp
 
end start

Объяснение кода листинга программы

  1. Установка начального сегмента данных и кода на 08h и 09h соответственно.
  2. Объявление переменных: строки, QName, CrLf, X.
  3. Ввод имени переменной в DS:QName, используя функцию 09h (int 21h).
  4. Ввод строки из консоли в DS:string, используя функцию 0Ah (int 21h).
  5. Ввод символа новой строки в DS:CrLf, используя функцию 09h (int 21h).
  6. Вызов функции Str2Num, которая преобразует строку в двоичное число и сохраняет результат в AX.
  7. Сохранение двоичного числа в переменной X.
  8. Вызов функции ShowBin, которая выводит двоичное число на консоль.
  9. Ввод пустой строки и завершение работы программы.
  10. Функция Str2Num:
    • Инициализация CX и SI для обхода строки.
    • Перебор символов строки, начиная со второго символа (17 в DS:string).
    • Преобразование каждого символа в его числовое представление (0-9) и добавление к AX.
    • Цикл продолжается до тех пор, пока не будет перебран весь символ строки.
  11. Функция ShowBin:
    • Инициализация BX для хранения двоичного представления числа.
    • Перебор 16 разрядов двоичного числа, начиная с младшего разряда.
    • Вывод каждого разряда на консоль с помощью функции 2 (int 21h).
  12. Вернуться к основному коду.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы