2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Обработчик прерываний на СИ
Сообщение08.10.2006, 20:40 


08/10/06
7
Требуется написать нерезидентный обработчик прерываний клавиатуры на СИ.(ну тупо перехватывать нажатия на клавиши, переназначать их действие). У кого есть идеи/опыт по этой теме ...help me! Так же можете выложить ссылочки на литературу. Заранее спасибо.

 Профиль  
                  
 
 
Сообщение09.10.2006, 03:19 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
А в какой системе? Это, знаете ли, важно.

 Профиль  
                  
 
 
Сообщение11.10.2006, 10:27 


21/03/06
1545
Москва
Рискну предположить, что речь идет о ДОС, ибо уточнется: "нерезидентный".
Подменяете вектор прерывания стандартного обработчика DOS (или там этим занимается еще BIOS?) на свой обработчик. Вектор стандартного обработчика сохраняете. После отработки вашего обработчика, вызываете стандартный (естественно, соблюдя все необходимые предосторожности, восстановив состояние регистров на момент вызова вашего обработчика и т.п.).
Вроде так.

 Профиль  
                  
 
 
Сообщение11.10.2006, 20:22 
Заслуженный участник
Аватара пользователя


23/07/05
17976
Москва
А какой вообще может быть нерезидентный обработчик? Он что, при каждом нажатии на клавишу должен заново загружаться в память? Боюсь, что DOS не сумеет это сделать. Если он, как и положено обработчику прерывания в DOS, постоянно сидит в памяти, то он резидентный.

 Профиль  
                  
 
 
Сообщение11.10.2006, 20:41 


08/10/06
7
Да обработчик нужен в среде DOS. Нерезидентный....я имел ввиду то, что по выходу из программы он должен выгрузится из памяти вернув всё на свои места....

Цитата:
Подменяете вектор прерывания стандартного обработчика DOS (или там этим занимается еще BIOS?) на свой обработчик. Вектор стандартного обработчика сохраняете. После отработки вашего обработчика, вызываете стандартный (естественно, соблюдя все необходимые предосторожности, восстановив состояние регистров на момент вызова вашего обработчика и т.п.).


А можно ли по-подробнее с примерами, и т.д. .... какие функции надо использовать...просто опыт пока небольшой... :wink:

 Профиль  
                  
 
 
Сообщение11.10.2006, 22:07 


21/03/06
1545
Москва
Цитата:
А какой вообще может быть нерезидентный обработчик? Он что, при каждом нажатии на клавишу должен заново загружаться в память? Боюсь, что DOS не сумеет это сделать. Если он, как и положено обработчику прерывания в DOS, постоянно сидит в памяти, то он резидентный.

Конечно, то что я описал - будет резидентной программой однозначно.

Если речь идет о
Цитата:
Да обработчик нужен в среде DOS. Нерезидентный....я имел ввиду то, что по выходу из программы он должен выгрузится из памяти вернув всё на свои места....

То можно:
1) Написать резидентный обработчик по тому принципу что я описал; После завершения программы его убрать из памяти, вернув старый обработчик в векторах прерываний;
2) Обработчик встроить в тело программы, подменить вектор на него, при выходе из программы вернуть вектор на старый обработчик, сам обработчик, как часть программы, убьется стандартным образом очисткой памяти;
3) Вообще не связываться с прерываниями, работать с клавиатурой напрямую (опрашивать состояние клавиш по таймеру) - имхо, наиболее дурацкий способ.
4) Ваш вариант :)

По поводу литературы на тему - попробуйте почитать книжки по ассемблеру, если нужно - приведу в пример хорошего автора (сейчас искать не могу - поздно, всех разбужу). В учебниках по ассемблеру для дос написание обработчика клавиатуры и мыши - один из базовых уроков.

Нескромный вопрос: а зачем в 2006 году использовать ДОС? :)

 Профиль  
                  
 
 
Сообщение11.10.2006, 23:45 
Заслуженный участник
Аватара пользователя


23/07/05
17976
Москва
e2e4 писал(а):
Если речь идет о
Цитата:
Да обработчик нужен в среде DOS. Нерезидентный....я имел ввиду то, что по выходу из программы он должен выгрузится из памяти вернув всё на свои места....

То можно:
1) Написать резидентный обработчик по тому принципу что я описал; После завершения программы его убрать из памяти, вернув старый обработчик в векторах прерываний;


Вообще-то, выгружать резидентный обработчик довольно опасно. После его загрузки мог установиться ещё какой-нибудь обработчик того же прерывания, и тогда корректное удаление нашего обработчика может стать нетривиальным. Безопаснее просто отключить его функции и освободить ставшую ненужной память.

e2e4 писал(а):
2) Обработчик встроить в тело программы, подменить вектор на него, при выходе из программы вернуть вектор на старый обработчик, сам обработчик, как часть программы, убьется стандартным образом очисткой памяти;


Да, верно. Я и сам этим методом пользовался, только давно уже, и сейчас вылетело из головы.

e2e4 писал(а):
По поводу литературы на тему - попробуйте почитать книжки по ассемблеру,


Пример на ассемблере у меня есть.

Код:
.286c
...
CODE    SEGMENT PARA PUBLIC 'CODE'
        ORG     100H
        ASSUME  CS:CODE
WV      PROC            ; scarves.ss
        JMP     SHORT START
OLD09H  LABEL   DWORD   ; Старый вектор прерывания от клавиатуры.
OFS09H  DW      ?
SEG09H  DW      ?
OLD1CH  LABEL   DWORD   ; Старый вектор прерывания от таймера.
OFS1CH  DW      ?
SEG1CH  DW      ?
FIN09H  DB      0       ; Признак нажатия клавиши.
MS      DB      0       ; Признак изменения состояния мыши.
TIMEND  DB      0       ; Признак таймерного прерывания.
MMOUSE  PROC    FAR     ; Обработка событий от мыши.
        INC     MS
        RET
MMOUSE  ENDP
INT09H: INC     FIN09H  ; Обработка нажатия клавиши.
        JMP     OLD09H
INT1CH: INC     TIMEND  ; Обработка прерывания от таймера.
        JMP     OLD1CH
        ASSUME  DS:CODE,SS:CODE
START:  MOV     BX,1000H
        MOV     AH,4AH
        INT     21H     ; Освобождение лишней памяти.
        MOV     AX,3509H
        INT     21H     ; Запрос старого вектора прерывания 09H.
        MOV     SEG09H,ES
        MOV     OFS09H,BX
        MOV     AL,1CH
        INT     21H     ; Запрос старого вектора прерывания 1CH.
        MOV     SEG1CH,ES
        MOV     OFS1CH,BX
        MOV     DX,OFFSET INT1CH
        MOV     AH,25H
        INT     21H     ; Установка нового вектора прерывания 1CH.
        MOV     DX,OFFSET INT09H
        MOV     AL,09H
        INT     21H     ; Установка нового вектора прерывания 09H.
        MOV     AH,0FH
        INT     10H     ; Запрос текущего видеорежима.
        MOV     VM,AL
        MOV     PG,BH
        MOV     AX,0012H
        INT     10H     ; Установка графического режима 640x480, 16 цветов.
        MOV     AX,3533H
        INT     21H     ; Запрос вектора прерывания 33H.
        MOV     AX,ES
        OR      AX,BX
        JZ      NOMOUS  ; Мыши нет.
        CMP     BYTE PTR ES:[BX],0CEH
        JE      NOMOUS  ; Мыши нет.
        XOR     AX,AX
        INT     33H     ; Инициализация мыши.
        OR      AX,AX
        JZ      NOMOUS  ; Мыши нет.
        MOV     MP,BL
        MOV     CX,0000000000011111B
        CMP     BL,3
        JNE     TWOB    ; Две клавиши.
        OR      CL,01100000B
TWOB:   MOV     AX,CS
        MOV     ES,AX
        MOV     DX,OFFSET MMOUSE
        MOV     AX,0014H
        INT     33H     ; Установка процедуры обработки мыши.
        MOV     CONDMOU,CX
        MOV     SEGMOU,ES
        MOV     OFSMOU,DX
...
        MOV     AH,00H
        MOV     AL,VM
        INT     10H     ; Восстановление видеорежима.
        MOV     AL,PG
        MOV     AH,05H
        INT     10H     ; Восстановление активной видеостраницы.
        MOV     CX,CONDMOU
        LES     DX,OLDMOU
        MOV     AX,000CH
        INT     33H     ; Восстановление старой процедуры обработки мыши.
...
        MOV     AX,251CH
        LDS     DX,OLD1CH
        ASSUME  DS:NOTHING
        INT     21H     ; Восстановление старого вектора прерывания 1CH.
        MOV     AL,09H
        LDS     DX,OLD09H
        INT     21H     ; Восстановление старого вектора прерывания 09H.
        JMP     SHORT TESTB
DELCH:  XOR     AH,AH
        INT     16H     ; Чтение символа из буфера клавиатуры.
TESTB:  MOV     AH,01H
        INT     16H     ; Проверка наличия символа в буфере клавиатуры.
        JNZ     DELCH   ; Буфер клавиатуры не пуст.
RT:     MOV     AX,4C00H
        INT     21H     ; Завершение программы.
WV      ENDP
...
; Данные основной программы.
VM      DB      ?       ; Первоначальный видеорежим.
PG      DB      ?       ; Активная видеостраница.
        EVEN            ; Выравнивание следующего поля на границу слова.
CONDMOU DW      ?
OLDMOU  LABEL   DWORD   ; Старый адрес процедуры обработки прерываний от мыши.
OFSMOU  DW      ?
SEGMOU  DW      ?
INIDATA EQU     THIS WORD
MP      DB      0       ; Признак наличия мыши.
...


Только по одному примеру не научишься. Нужно в справочнике почитать описания прерываний.

e2e4 писал(а):
Нескромный вопрос: а зачем в 2006 году использовать ДОС? :)


Недавно наблюдал в банке: на компьютере загружена Windows XP, открыто окно DOS, и в этом окне запущена программа.

 Профиль  
                  
 
 
Сообщение12.10.2006, 17:45 


08/10/06
7
Цитата:
Нескромный вопрос: а зачем в 2006 году использовать ДОС? :)

Ну дело в том что всё начинается с азов.....я учусь на 2 курсе...видимо это азы... :))
такое вот у нас "современное" образование...

 Профиль  
                  
 
 
Сообщение12.10.2006, 22:33 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
e2e4 писал(а):
Нескромный вопрос: а зачем в 2006 году использовать ДОС? :)


Ну, есть ведь DOS-7, под которой можно запускать разные утилиты для обработки системного раздела. Я таким образом резервные копии раздела делаю.

 Профиль  
                  
 
 
Сообщение13.10.2006, 04:46 
Заслуженный участник


15/05/05
3445
USA
Вот отсюда: http://rapidshare.de/files/36532177/Frolovy_DOS.rar.html
Вы можете скачать архив (917901 байт) с четырьмя книжками (+сырцы):
Александр Фролов, Григорий Фролов. Библиотека Системного Программиста.
Том 1. Операционная система MS-DOS.
Том 6. Защищенный режим процессоровIntel 80286/8036/80486.
Том 18. MS-DOS для программиста, часть 1
Том 19. MS-DOS для программиста, часть 2
Интересующий Вас вопрос рассматривается в 5-й главе 18-го тома.

 Профиль  
                  
 
 
Сообщение13.10.2006, 12:04 


21/03/06
1545
Москва
Someone писал(а):
Вообще-то, выгружать резидентный обработчик довольно опасно. После его загрузки мог установиться ещё какой-нибудь обработчик того же прерывания, и тогда корректное удаление нашего обработчика может стать нетривиальным. Безопаснее просто отключить его функции и освободить ставшую ненужной память.

Совершенно верно. Вылетело из головы, а ведь когда-то знал :).

Someone писал(а):
Недавно наблюдал в банке: на компьютере загружена Windows XP, открыто окно DOS, и в этом окне запущена программа.

Да, точно. Бывает и такое. В любом случае, мне кажется, для запуска программ под ДОС необходимо пользоваться либо виртуальной машиной (что довольно неудобно), либо ДОС-эмулятором - например, у меня стоит DOSbox - для старых игр, эмулируется правда медленно, но нареканий на качество эмуляции пока нет. Я что хочу сказать: если уж ставится цель запустить и работать с ДОС-программой, то, скорее всего, кроме этой единственной программы ничего от ДОС'а не требуется. Таким образом, можно писать свой код, не заботясь о тонкостях загрузки нескольких обработчиков одного и того же события, и т.п. Вообще, не имеет смысла заморачиваться с выгрузкой своих резидентных программ :).

Denis5455 писал(а):
Ну дело в том что всё начинается с азов.....я учусь на 2 курсе...видимо это азы... )
такое вот у нас "современное" образование...

Наверное, ваш преподаватель читает этот курс уже много лет, и не собирается его менять. ИМХО: знать ДОС нужно. Знать досконально - не требуется. Хотя, конечно, кое-какие принципы этой ОС бывают полезны и по сей день. ХЗ в общем. Может, он и прав.

PAV писал(а):
Ну, есть ведь DOS-7, под которой можно запускать разные утилиты для обработки системного раздела. Я таким образом резервные копии раздела делаю.

А что это за ОС такая? Не могли бы вкратце рассказать или дать ссылку на инфу?

 Профиль  
                  
 
 
Сообщение13.10.2006, 15:15 
Заслуженный участник


15/05/05
3445
USA
e2e4 писал(а):
Наверное, ваш преподаватель читает этот курс уже много лет, и не собирается его менять. ИМХО: знать ДОС нужно. Знать досконально - не требуется.

IMHO это верно для 99.9% программистов. Но для специалистов по безопасности, разработчиков драйверов и прочих системщиков обязательно хорошее понимание системы прерываний, защищенного режима и т.п. В этом смысле ДОС - хорошая "детская площадка".
И начет ассемблера: клавиатурный резидент можно и на C написать.

 Профиль  
                  
 
 
Сообщение13.10.2006, 19:14 


08/10/06
7
Цитата:
IMHO это верно для 99.9% программистов. Но для специалистов по безопасности, разработчиков драйверов и прочих системщиков обязательно хорошее понимание системы прерываний, защищенного режима и т.п. В этом смысле ДОС - хорошая "детская площадка".
И начет ассемблера: клавиатурный резидент можно и на C написать.

1) Да я учусь на специальности "комплексная защита объектов информации" :)
2)
Цитата:
И начет ассемблера: клавиатурный резидент можно и на C написать.

...а можете подсказать как.. :) пока не очень понятно... :?
3)Yuri Gendelman спаисбо!

 Профиль  
                  
 
 
Сообщение14.10.2006, 04:32 
Заслуженный участник


15/05/05
3445
USA
Denis5455 писал(а):
...а можете подсказать как..

Вам подсказывают братья Александр и Григорий Фролов в книге
"MS-DOS для программиста, часть 1" (БСП. Том 18)

Глава 5. Резидентные программы
* 5.1. Резидентная программа TSRDEMO
* 5.2. Инициализация резидентной программы
* 5.3. Установка обработчиков прерываний
* 5.4. Активизация резидентной программы
* 5.5. Выгрузка резидентной программы из памяти
* 5.6. Листинги программы TSRDEMO

Все исходные тексты приложены.

 Профиль  
                  
 
 
Сообщение14.10.2006, 07:33 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Дела давно минувших дней, // Преданья старины глубокой.

Я жутко давно не играл в эти машинки. Пишу по памяти, так что не обессудьте, что-то может быть и не так.

1) Нерезидентный обработчик прерываний -- это обработчик прерываний, который ставится программой и удаляется до ее завершения. То есть, существующий только во время исполнения программы. Программа же не пытается стать резидентной -- обычное приложение, коих тьмы тем.

2) Для написания обработчика на С надо найти в руководстве к оному С (а точнее, к его компилятору), как объявить функцию обработчиком прерывания. Часто это прагма. Иногда -- ключевое слово a la __cdecl. Смысл в том, что прерывание оформляется по слегка другим правилам, и поэтому компилятор должен знать, что эта функция -- особая.

3) Будьте внимательны! обработчик прерываний вызывается на неизвестно каком стеке (да и все остальное неизвестно что). Будьте предельно экономны со стеком. На ассемблере "функционально-богатые" обработчики мигрируют на собственный стек, но на С это гораздо тяжелее.

4) Не забудьте открыть прерывания (глобальные) как только это станет возможным. То есть, как только Вы достигнете реентерабельной стадии обработки прерывания.

5) В том же руководстве Вы скорее всего найдете, как сохранить, восстановить и вызвать обработчик прерывания (обычно имеет смысл обработка только отдельных событий, все остальные отдаются "старому" обработчику прерываний).

6) Для клавиатуры со времен AT существует три прерывания: 09h (железная кнопка), 16h (BIOS -- выборка из буфера клавиатуры) и 15h функция 4Fh (BIOS -- перекодировка scan-кода). Для переключателей клавиатуры последнее является самым уместным.

Удачи! Будут вопросы -- спрашивайте, но не забудьте уточнить, о каком компиляторе идет речь, о каком прерывании, и т.д. Кстати, знаменитый Interrupts и сейчас можно найти в Сети.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group