Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Преобразование в двоичную форму

Вопрос:
Пытаюсь решить вот такую задачку: «Написать программу преобразования в двоичную форму упакованного четырехразрядного двоично-десятичного числа (введенного с клавиатуры) и вывода результата преобразования на экран в двоичном виде». Я тут пыталась что-то сотворить, но почему-то в отладчике вроде все получается и программа выдает верный результат, а просто при запуске программы на экране появляется огромное кол-во 0 и 1. В общем, скажите, ПОЖАЛУЙСТА, правильно ли я решаю эту задачу?
.model	tiny ; Модель памяти, используемая для COM
	.code        ; Начало сегмента кода
	org	100h ; Начальное значение счетчика - 100h

begin:

   mov ah,0ah         
   mov dx,offset buffer
   int 21h
;======================   inc dx       ; Адрес буфера ввода+1,dx тепрь указывает на dlina-кол-во введенных символов
   mov di,dx    ; В di адрес переменной dlina
   mov bl,[di]  ; Значение байта, находящемуся по адресу в di, в bl, bl - ДЛИНА-кол-во  введенных символов
   mov [di],ah  ; dlina=ah
   xor bh,bh    ; bh:=0
   inc di       ; di:=di+1, теперь di содержит адрес начала строки text
;=====================   
xor ax,ax

m:
   mov ax,[di]
   and ax,000fh   ; Очистить зону тройки

;===============================mov bx,2       ; Система счисления, в которой будем выводить число
  xor cx,cx       ; Количество цифр
;
isDiv:
  xor dx,dx
  div bx          ; Получаем крайнюю справа цифру
  push dx         ; Запоминаем
  inc cx
  or ax,ax        ; Если получили не все цифры, продолжаем
  jnz isDiv

isOut:
  pop ax          ; Восстанавливаем цифру
  or ax,30h       ; Переводим её в символ
  int 29h         ; Выводим
loop isOut
  inc di
  inc si
  cmp si,4
  jne m
  mov ah,10h
  int 16h
;***********************************************************************

   int 20h
;====================== buffer db 5     ; Максимальная длина ввода строки
 text   db 5 dup ()   ; Фактически ввод размещается здесь
end	begin

Ответ:
В отладчике все хорошо потому что от обнуляет si, в общем ваша программа работает правильно.
.model tiny 
.code
org 100h ;

begin:
mov ah,0ah 
mov dx,offset buffer
int 21h
;======================
inc dx
mov di,dx 
mov bl,[di] ; bl - ДЛИНА-кол-во введенных символов
mov [di],ah ; dlina=ah ????? эта строка непонятна зачем?
xor bh,bh ; bh:=0
inc di ; di:=di+1, теперь di содержит адрес начала строки text
;===================== 
xor ax,ax

m:
mov ax,[di]
and ax,000fh ; Очистить зону тройки? какой тройки? выделить цифру из первого символа, если введена цифра (символ)!!!

;===============================
mov bx,2 ; количество введенных символов потеряли!!!
xor cx,cx ; Количество цифр???? cx=0
;
isDiv:
xor dx,dx
div bx ;
push dx ;
inc cx
or ax,ax ; в цифре 4 бита всегда возможно нули тоже нужно будет вывести?
jnz isDiv

isOut:
pop ax ; Восстанавливаем цифру
or ax,30h ; Переводим её в символ
int 29h ; Выводим
loop isOut
inc di
inc si ; какое начальное занчение si было до этого кода?
cmp si,4; почему именно 4?
jne m
mov ah,10h
int 16h
;***********************************************************************
int 20h
;======================
buffer db 5 ; не правильно определен буфер требуется +1 байт для символа конца строки -> 5,0(сколько реально ввели символов),5 dup ()
text db 5 dup () ;
end begin


   Вперёд
   Содержание