Консультация № 142441
27.08.2008, 23:43
0.00 руб.
0 4 1
Здравствуйте, Уважаемые Эксперты!!! Нужна Ваша помощь. Пытаюсь решить вот такую задачку: «Написать программу преобразования в двоичную форму упакованного четырехразрядного двоично-десятичного числа (введенного с клавиатуры) и вывода результата преобразования на экран в двоичном виде».
Я тут пыталась что-то сотворить, но почему-то в отладчике вроде все получается и программа выдает верный результат, а просто при запуске программы на экране появляется огромное кол-во 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

Обсуждение

Неизвестный
28.08.2008, 08:32
общий
это ответ
В отладчике все хорошо потому что от обнуляет 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
Неизвестный
28.08.2008, 18:18
общий
Спасибо! Теперь ясно.
Вот только скажите, ПОЖАЛУЙСТА, а как Вы узнали, что сама программа не обнуляет si?
И почему отладчик обнуляет, а сама программа нет?
давно
Посетитель
7438
7205
01.09.2008, 15:04
общий
Позвольте мне объяснить...
То, что "сама программа не обнуляет si", видно из текста Вашей программы.
Обнулить может "кто-то" после загрузки, но до запуска программы.
Например, досовский загрузчик программ. Но он, увы, этого не делает! Ну вот так он написан!
Никто не обязывал обнулять регистры, вот и не делает этого!
Программа должна сама беспокоиться о начальном содержимом необходимых регистров.
Можно в качестве упражнения написать программку, которая выводит на экран содержимое
всех регистров на экран после загрузки программы.
Вот отладчики, они обычно обнуляют все остальные регистры...Так вот повелось...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
01.09.2008, 19:51
общий
Большое СПАСИБО, Игорь Витальевич!!!
Форма ответа