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