![]() |
|
![]() ![]() ![]() |
|
Sanek123 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 22.10.2008 Репутация: нет Всего: нет |
Вот исходник проги считающей значение по формуле и введенным с клавы цифрам.
Тема такая что вводятся как цифры так и буквы, - и причем считает! Каким образом установить фильтр ввода с клавы - чтоб вводились толь цифры? Трудно тем, что никак не отввыкну от Pascal... Там бы я написал типа if (key not in '0..9') then? а здесь как работать с условием? с диапазоном? Умные книжки говорят что надо отслеживать аскии-код клавиши, но не говорят как! Это сообщение отредактировал(а) Sanek123 - 20.5.2009, 12:49 --------------------
Вас разыскивают бойцы 139-го порта... |
|||
|
||||
ФедосеевПавел |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Тут решением будет оформление ввода чисел в отдельную процедуру. Вводить по одному символу без отображения на экран. Потом проверить если символ из диапазона '0'...'9' то вывести на экран и выполнить преобразование в число.
Вводить можно int 21h ah=08h, выводить int 21h ah=02h. Проверка диапазона примерно так
Сейчас навскидку в форуме не вижу похожих примеров. Не совсем то, но близко процедура ReadInteger - тут нет фильтра. Или ещё примеры в FAQ |
|||
|
||||
Sanek123 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 22.10.2008 Репутация: нет Всего: нет |
Получилось вот так:
Подскажите как теперь присвоить введнные числа пременным, например x,y,z и вывести резултат, скажем сложения всех трех на экран? Точнее я не понимаю где все эти значения храняться в каких регистрах? Это сообщение отредактировал(а) Sanek123 - 24.5.2009, 22:52 --------------------
Вас разыскивают бойцы 139-го порта... |
|||
|
||||
ФедосеевПавел |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Sorry. Командировка.
Прости, но не вижу ввода числа - есть ввод символов из диапазона '0'-'9', но нет обработки введенного символа. Ещё раз посмотри в FAQ - конкретно процедуры ввода/вывода знаковых целых inint и outint. Вот пример использования
Саму процедуру inint с добавлением фильтра я переписал так
|
||||
|
|||||
Sanek123 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 22.10.2008 Репутация: нет Всего: нет |
Я так понимаю резултат-число сохранен в ах, можно ли применить
--------------------
Вас разыскивают бойцы 139-го порта... |
|||
|
||||
ФедосеевПавел |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Прости, я не сразу увидел, что у тебя в двух темах обсуждается один вопрос.
И всё равно не пойму твой вопрос. Причём в твоём коде AX - его там просто нет... Нет и объяснения, что за массив chislo. Я привёл два куска кода: первый - фрагмент рабочей программы с вызовом процедур ввода и вывода целых чисел, а второй - процедура ввода (с фильтром) целого числа. Процедуру вывода (outint) - для вывода результата на экран - я не стал копировать из FAQ'а. От тебя требуется разобраться как они работают, вставить в текст программы и вызывать по мере необходимости. Посмотри пример - ввод трёх чисел (x,y,z), вычисление r (r=x+y-z) и вывод результата. Присоединённый файл ( Кол-во скачиваний: 21 ) ![]() |
|||
|
||||
octopus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.9.2010 Репутация: нет Всего: нет |
Ребята, спасибо Вам за содержательные тексты! Просто спасли...Но у меня вопрос, сколько ни билась, понять не могу самостоятельно:
что происходит в этом фрагтенте кода? ; Умножим текущий результат на 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. Заранее спасибо. |
|||
|
||||
ФедосеевПавел |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Оп-па... А я, когда переделывал процедуру, даже и не заметил этого...
Тут всё правильно вычисляется, но несколько непривычно.
Здесь показано умножение BX на 10, а потом, сложение со значением в AL. Только вместо операции умножения используются две операции сдвига (замена умножения BX на 2 и на 8) и несколько операций сложения. BX:=10*BX+AL=8*BX+2*BX+AL Можно, в принципе, заменить на MUL, но там нужно будет следить за регистром DX (см. описание MUL). |
|||
|
||||
octopus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.9.2010 Репутация: нет Всего: нет |
)) Cпасибо, дошло теперь)))
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для Windows/DOS" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для Windows/Dos | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |