Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 18:54   #1
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию Ввод символа с эхо без ожидания ентера

Всем привет.
Пытаюсь своими силами постичь ассемблер, нашел школьную задачу (Найти количество слов в введенном потоке), решил, что будет интересно её реализовать на асме.

Смысл задачи таков:
"qw er ty" -> 3
"qw" -> 1
"" -> 0

Очевидно, ентер пользователь нажмёт только когда закончит ввод строки, а сохранять строку в память не имеет смысла, проще обрабатывать её сразу посимвольно.

Блок-схема реализации во вложении.

Вот реализация:
Код:
   CODE SEGMENT
   ORG 100h
   ASSUME cs:code, ds:code
   Begin:  

      mov cl, 0 ; flag
      mov ch, 0 ; counter
      
      loop:
         mov ah, 07h
         int 21h   

         mov ah, 02h
         mov dl, al
         int 21h   

         cmp al, 13
         je tail
         mov cl, 1
         cmp al, 32
         jne loop
         add ch, 1
         jmp loop 

      tail:
         cmp cl, 1
	 jne end
         add ch, 1

      end:
         mov ah, 02h
         mov dl, 0ah
         int 21h   
         mov dl, 0dh
         int 21h       
         mov dl, ch
         add dl, '0'
         int 21h       

         mov ah, 08h
         int 21h          
         int 20h
                       
   CODE ENDS
   END Begin
Не знаю, правильно ли так считывать символы? И вместо функции 02h после 07h есть ли такая, которая считывает с эхо и без ентера? Правильно ли я понимаю, что этот цикл не ждет нажатия и выполняется очень много раз?

p.s.: Прошу любых дополнений и исправлений, например, чтоб программа работала и при больше девяти слов. Примерно понимаю, как это сделать, но будет 99, 999 и т.д., но есть ли универсальный способ?

p.p.s: Наверное, стоило занести в "Помощь студентам", но я в этом не уверен. Перенесите, плз, если так.
Изображения
Тип файла: jpg Блок-схема.jpg (26.5 Кб, 116 просмотров)
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Старый 10.03.2013, 19:04   #2
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию

Посмотрел диспетчер задач, процесс ntvdm.exe тратит 100% процессорного времени. Видимо цикл действительно выполняется ооочень много раз..

P.S.: с вводом разобрался, необходимо использовать функцию 01h из того же прерывания.

Остальные вопросы все еще в силе)
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)

Последний раз редактировалось AnKor94; 10.03.2013 в 23:37. Причина: [solved]
AnKor94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение участка кода без ожидания ввода БалаШагаЛ Общие вопросы C/C++ 5 09.06.2011 12:17
Реализация ожидания без подвисания программы. (Delphi 7) Chaosito Помощь студентам 3 07.02.2011 07:42
Ввод символа без эха Ратмир Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.11.2010 20:25
DepositFiles и Letitbit - теперь с них можно качать без ожидания goblinyara Свободное общение 10 13.01.2009 02:22