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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 09:57   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Работа с клавиатурой ASM

Хотел бы задать несколько вопросов. Пока возник такой.
Код:
mov ah, 0ah
int 21h
Так в любом случае происходит ожидание нажатий вплоть до нажатия на Enter. Как сделать так, чтобы если ничего не нажато, выполнение не останавливалось в ожидании ввода? Немаловажный вопрос в том, как это обрабатывать, потому что в итоге я должен получить двоичное число, соответствующее числу на клавише (а по нему задается интервал времени в программе), а если нажму в конце Enter, то его я и не смогу проверить, как я понял, ведь FIFO.
Krasi вне форума Ответить с цитированием
Старый 23.01.2012, 09:59   #2
arrowsf1
Пользователь
 
Аватар для arrowsf1
 
Регистрация: 22.01.2012
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
выполнение не останавливалось в ожидании ввода?
а разве такое не только в виндоусе. он пом только из-за этого и создан
Модераторам: не баньте, у мя такие полезные советы, они стоющие
arrowsf1 вне форума Ответить с цитированием
Старый 23.01.2012, 10:24   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А мне нельзя в Виндоусе. А как, если что? Мне максимум с векторами прерываний можно работать, вообще я и этого не хочу. Но если можно что-то придумать, то хэлп. С другой стороны, еще не доходит, как напрямую считать слово состояния адреса контроллера клавиатуры и индикации. Я пытаюсь разобраться с I8086, на emu8086, то есть это не защищенный режим.

Последний раз редактировалось Krasi; 23.01.2012 в 10:27.
Krasi вне форума Ответить с цитированием
Старый 23.01.2012, 11:49   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Krasi, да можно и без ожидания крутить цикл!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2012, 12:10   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Цитата:
Как сделать так, чтобы если ничего не нажато, выполнение не останавливалось в ожидании ввода?
использовать функцию 0bh,21h прерывания
Код:
mov  ah,0bh
int  21h
cmp  al,0ffh
jne  readkey ; переход на метку для чтения нажатой клавиши
или через 16h прерывание
Код:
mov  ah,1
int  16h
jnz  readkey
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 23.01.2012, 12:26   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Так нужно несколько клавиш. Типа того: ввожу число 1000, пока ввожу - ничего, ввел Интер - обработка. Хотя я подумал, можно обрабатывать и последовательно, а во время Интер останавливать формирование разрядов. Но думаю, как, пока не доходит. Я не хочу использовать память, а число может быть 6 разрядным, мне что, забивать все регистры? Ну то есть, как я понял, в I8086 ни кэша, ни стека без RAM.

Последний раз редактировалось Krasi; 23.01.2012 в 12:38.
Krasi вне форума Ответить с цитированием
Старый 23.01.2012, 12:33   #7
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Используйте код выше, при нажатии клавиши - считываете и проверяете на Enter, если не он - помещайте в свой буфер, если Enter - обрабатывайте данные из своего буфера с последующей его очисткой ...
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 23.01.2012, 12:54   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Где же я возьму буфер? Было бы удобнее сразу после Интер оценить количество символов в буфере контроллера клавиатуры, затем формировать разряды. А как тогда очищать буфер клавиатуры при ah=1 и 16h?

Последний раз редактировалось Krasi; 23.01.2012 в 13:05.
Krasi вне форума Ответить с цитированием
Старый 23.01.2012, 13:08   #9
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
 Count    dw  0
Buf   db  10 dup(?)
     ...
l:
      ... ; тело цикла
      mov   ah,1
      int   16h
      jnz   readkey
      jmp   l
readkey:
      mov   ah,0
      int   16h
      cmp   al,0
      jz    l
      cmp   al,13
      je    work
      mov   bx,Count
      mov   Buf[bx],al
      inc   Count
      jmp   l
work:     
     ;обработка введенной последовательности, в Count - длина
     ...
      mov  Count,0
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 23.01.2012, 13:21   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы уж простите меня, я вообще не пойму, зачем в данной задаче ввод без ожидания?!! Обыкновенный буферизированнный ввод (функция 0Ah прерывания 21h), имхо, позволит ввести нужные символы и отдаст их в буфере после нажатия Enter!
Или я что-то не понимаю в данной задаче?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с клавиатурой DalBor9 Паскаль, Turbo Pascal, PascalABC.NET 3 13.10.2011 14:45
Работа с клавиатурой! FartNick Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.10.2010 17:20
работа с клавиатурой progN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 30.04.2010 17:22
Работа с клавиатурой в С++ Matr1x C++ Builder 5 27.01.2010 22:56
Работа с клавиатурой АлексейМк Общие вопросы C/C++ 1 05.08.2009 01:27