Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для Windows/Dos > ASM - фильтр ввода цифр с клавиатуры |
Автор: Sanek123 20.5.2009, 12:48 | ||
Вот исходник проги считающей значение по формуле и введенным с клавы цифрам.
Тема такая что вводятся как цифры так и буквы, - и причем считает! Каким образом установить фильтр ввода с клавы - чтоб вводились толь цифры? Трудно тем, что никак не отввыкну от Pascal... Там бы я написал типа if (key not in '0..9') then? а здесь как работать с условием? с диапазоном? Умные книжки говорят что надо отслеживать аскии-код клавиши, но не говорят как! |
Автор: ФедосеевПавел 20.5.2009, 19:16 | ||
Тут решением будет оформление ввода чисел в отдельную процедуру. Вводить по одному символу без отображения на экран. Потом проверить если символ из диапазона '0'...'9' то вывести на экран и выполнить преобразование в число. Вводить можно int 21h ah=08h, выводить int 21h ah=02h. Проверка диапазона примерно так
Сейчас навскидку в форуме не вижу похожих примеров. Не совсем то, но близко http://forum.sources.ru/index.php?showtopic=271401&view=showall - тут нет фильтра. Или ещё примеры в http://forum.vingrad.ru/faq/topic-158522/kw-ввод-вывод-числа.html |
Автор: Sanek123 24.5.2009, 21:17 | ||
Получилось вот так:
Подскажите как теперь присвоить введнные числа пременным, например x,y,z и вывести резултат, скажем сложения всех трех на экран? Точнее я не понимаю где все эти значения храняться в каких регистрах? |
Автор: ФедосеевПавел 30.5.2009, 12:31 | ||||
Sorry. Командировка. Прости, но не вижу ввода числа - есть ввод символов из диапазона '0'-'9', но нет обработки введенного символа. Ещё раз посмотри в http://forum.vingrad.ru/faq/topic-158522/kw-ввод-вывод-числа.html - конкретно процедуры ввода/вывода знаковых целых inint и outint. Вот пример использования
Саму процедуру inint с добавлением фильтра я переписал так
|
Автор: Sanek123 30.5.2009, 14:40 | ||
Я так понимаю резултат-число сохранен в ах, можно ли применить
|
Автор: ФедосеевПавел 30.5.2009, 16:27 |
Прости, я не сразу увидел, что у тебя в двух темах обсуждается один вопрос. И всё равно не пойму твой вопрос. Причём в твоём коде AX - его там просто нет... Нет и объяснения, что за массив chislo. Я привёл два куска кода: первый - фрагмент рабочей программы с вызовом процедур ввода и вывода целых чисел, а второй - процедура ввода (с фильтром) целого числа. Процедуру вывода (outint) - для вывода результата на экран - я не стал копировать из FAQ'а. От тебя требуется разобраться как они работают, вставить в текст программы и вызывать по мере необходимости. Посмотри пример - ввод трёх чисел (x,y,z), вычисление r (r=x+y-z) и вывод результата. |
Автор: octopus 4.10.2010, 08:53 |
Ребята, спасибо Вам за содержательные тексты! Просто спасли...Но у меня вопрос, сколько ни билась, понять не могу самостоятельно: что происходит в этом фрагтенте кода? ; Умножим текущий результат на 10. shl bx, 1 ; BX = 2 * bx mov ax, bx ; AX = 2 * bx shl ax, 2 ; AX = 8 * bx add bx, ax ; BX = 10 * bx add bx, cx ; BX = 10 * bx + al Кусок из процедуры inint. Заранее спасибо. |
Автор: ФедосеевПавел 4.10.2010, 14:44 | ||
Оп-па... А я, когда переделывал процедуру, даже и не заметил этого... Тут всё правильно вычисляется, но несколько непривычно.
Здесь показано умножение BX на 10, а потом, сложение со значением в AL. Только вместо операции умножения используются две операции сдвига (замена умножения BX на 2 и на 8) и несколько операций сложения. BX:=10*BX+AL=8*BX+2*BX+AL Можно, в принципе, заменить на MUL, но там нужно будет следить за регистром DX (см. описание MUL). |
Автор: octopus 4.10.2010, 18:12 |
)) Cпасибо, дошло теперь))) ![]() |