Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опрос буфера клавиатуры, Опрос клавиатуры без остановки программы 
V
    Опции темы
igSde
Дата 12.5.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Мне нужен аналог данного Pascal кода  на Ассемблере.

if KeyPressed
  then
    S := readKey;

Спасибо.
PM MAIL   Вверх
airyashov
Дата 12.5.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



пользуемся поиском int 16h


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
iff
Дата 12.5.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Код

mov ah, 11h
int 16h
jz exit
mov s, al
exit:

или высокоуровнево при помощи прерываний ДОС:
Код

mov ah, 0bh
int 21h
cmp al, 0
je exit
mov ah, 7
int 21h
mov s, al
exit:


Это сообщение отредактировал(а) iff - 23.5.2010, 12:00


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
igSde
Дата 14.5.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Только сегодня проверил предложенные решения,
к сожалению, во обоих случаях программа не работает.
AL обнуляется во время вызова прерываний :

  mov ah,11h
   int 16h 

   mov ah,0bh
   int 21h


DSEG SEGMENT
  s db 0
DSEG ENDS

;--------------- stack segment -------------------------------
SSEG SEGMENT STACK
    DW 100h DUP(?)
SSEG ENDS


;---------------- code segment --------------------------------
CSEG SEGMENT
  ASSUME DS:DSEG,SS:SSEG,CS:CSEG

  START:mov AX,DSEG
        mov DS,AX

  
 
   mov ah, 01h
   int 21h
   

  ; mov ah, 0bh
  ; int 21h
  ; cmp al, 0
  ; jz exit
  ; mov ah, 7
  ; int 21h
  ; mov s, al

   mov ah,11h
   int 16h
   cmp al, 0
   jz exit
 
   mov s, al
exit: 
;--------------------- return to Dos ------------
     mov AH,4ch
     int 21h

 
   CSEG ENDS
   END START
 
В чем проблема/ошибка?

Cпасибо.

Это сообщение отредактировал(а) igSde - 22.5.2010, 19:16
PM MAIL   Вверх
igSde
Дата 22.5.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Только сегодня проверил предложенные решения,
к сожалению, во обоих случаях программа не работает.
AL обнуляется во время вызова прерываний :

  mov ah,11h
   int 16h 

   mov ah,0bh
   int 21h


DSEG SEGMENT
  s db 0
DSEG ENDS

;--------------- stack segment -------------------------------
SSEG SEGMENT STACK
    DW 100h DUP(?)
SSEG ENDS


;---------------- code segment --------------------------------
CSEG SEGMENT
  ASSUME DS:DSEG,SS:SSEG,CS:CSEG

  START:mov AX,DSEG
        mov DS,AX

  
 
   mov ah, 01h
   int 21h
   

  ; mov ah, 0bh
  ; int 21h
  ; cmp al, 0
  ; jz exit
  ; mov ah, 7
  ; int 21h
  ; mov s, al

   mov ah,11h
   int 16h
   cmp al, 0
   jz exit
 
   mov s, al
exit: 
;--------------------- return to Dos ------------
     mov AH,4ch
     int 21h

 
   CSEG ENDS
   END START
 
В чем проблема/ошибка?

Cпасибо.

PM MAIL   Вверх
airyashov
Дата 22.5.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



вы случаем не расширенные клавиши нажимаете


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
iff
Дата 22.5.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



1. Используйте тег код!
2. А что значит не работает?
Дело в том, что в вашей программе, при исполнении того-самого куска кода (который я раньше предложил), не будет в находится в очереди в буфере клавиатуры какой-либо символ. (если вы конечно не умудритесь нажать клавишу в нужный момент или не переопределите поток ввода, например из файла).
И ещё некоторое замечание: функция 11h прерывания int 16h не очищает буфер от очереди символов. Для очистки буфера клавиатуры можно использовать например функцию 00h прерывания int 16h.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
igSde
Дата 23.5.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Перед Вашим кодом я ввожу символ ( не расширенные клавиши ) и проверяю в TD содержимое AL.

 ;-------------------Первый вариант----------------

   mov ah, 01h
   int 21h

  mov ah, 0bh
  int 21h

AL обнуляется здесь  
  cmp al, 0
   jz exit
  mov ah, 7
  int 21h
  mov s, al

  

; --------------Второй вариант----------------

   mov ah, 01h
   int 21h


 mov ah,11h
   int 16h

AL обнуляется здесь

   cmp al, 0
   jz exit
 
   mov s, al
exit: 


Cпасибо.

PM MAIL   Вверх
iff
Дата 23.5.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



1. Пользуйтесь тегом код!!!
2. Когда вы считываете символ функцией 1 прерывания 21, он УДАЛЯЕТСЯ из буфера и более не остается там. Поэтому всё правильно: когда программа пордходит к тому месту, где проходит проверка буфера, то в нем нет символов.
3. Во втором варианте у меня ошибка: строку cmp al, 0 нужно убрать. поличится:
Код

   mov ah,11h
   int 16h
   jz exit
   mov s, al
exit: 

или (другая аналогичная функция этого прерывания):
Код

   mov ah,1
   int 16h
   jz exit
   mov s, al
exit: 


Добавлено через 1 минуту и 42 секунды
Правда при применении этих функций символ в буфере так и останется.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
igSde
Дата 25.5.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Разобрался сам, еще раз спасибо!


Это сообщение отредактировал(а) igSde - 25.5.2010, 11:35
PM MAIL   Вверх
iff
Дата 25.5.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Чего разобрался сам, всё же объяснено выше)))))))))))


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
igSde
Дата 27.5.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Я было написал еще одно сообщение  (с кодом, который работал не  на все 100%),
да что-то его не вижу в форуме. А следующее, когда разобрался с ошибкой, в наличии.
Отсюда и "разобрался сам" ...
А как прочитать расширенный код?

PM MAIL   Вверх
iff
Дата 27.5.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Цитата(igSde @  27.5.2010,  00:30 Найти цитируемый пост)
А как прочитать расширенный код?

Имееш ввиду скан-код?

Код

mov ah, 10h
int 16h
; al = Код символа, если был введен обычный символ ASCII; 0, если нажата расширенная функцианальная клавиша; E0h, если нажата дублирующая функциональная клавиша
; ah = Скан-код клавиши



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
igSde
  Дата 27.5.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.