KURSOV (664697), страница 2

Файл №664697 KURSOV (Резидентный обработчик клавиатуры (перехват нажатий клавиш и запись в файл)) 2 страницаKURSOV (664697) страница 22016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Выгрузку резидентной программы из памяти можно осуществить разными способами. Наиболее простой - освободить блоки памяти, за­нимаемые программой (собственно программой и ее окружением) с помощью функции DOS 49h. Другой, более сложный - использовать в выгружающей программе функцию завершения 4Ch, заставив ее завер­шить не саму выгружающую, а резидентную программу, да еще после этого вернуть управление в выгружающую. В любом случае перед осво­бождением памяти необходимо восстановить все векторы прерываний, перехваченные резидентной программой. Следует подчеркнуть, что вос­становление векторов представляет в общем случае значительную и иногда даже неразрешимую проблему. Во-первых, старое содержимое вектора, которое хранится где-то в полях данных резидентной програм­мы, невозможно извлечь "снаружи", из другой программы, так как нет никаких способов определить, где именно его спрятала резидентная программа в процессе инициализации. Поэтому выгрузку резидентной программы легче осуществить из нее самой, чем из другой программы. Во-вторых, даже если выгрузку осуществляет сама резидентная про­грамма, она может правильно восстановить старое содержимое вектора лишь в том случае, если этот вектор не был позже перехвачен другой резидентной программой. Если же это произошло, в таблице векторов находится уже адрес не выгружаемой, а следующей резидентной про­граммы, и если восстановить старое содержимое вектора, эта следующая программа "повиснет", лишившись средств своего запуска. Поэтому на­дежно можно выгрузить только последнюю из загруженных резидент­ных программ.

В нашей программе подфункция 00h прерывания 2Fh служит для проверки на повторную установку, а подфункция 01h - для выгрузки. В секцию инициализации добавлены строки сохранения старого содержимого вектора 09h. Это выполняется точно так же, как и для вектора 2Fh - с помощью функции DOS 35h. Старый вектор сохра­няется в ячейке old_09h, размещаемой в резидентной части программы. Поскольку выгрузка программы выполняется с помощью прерывания 2Fh, текст обработчика этого прерывания усложняется.

Резидентный обработчик прерывания 2Fh прежде всего проверяет номер функции, поступивший в регистре АН, Если этот номер от­личается от F1h, управление передается следующему обработчику по цепочке. Далее анализируется содержимое регистра AL. Если AL=00h, выполняются действия по защите от повторной загрузки. Если AL=01h, осуществляется переход на метку uninstall для выполнения действий по выгрузке программы. При любом другом номере подфункции управле­ние передается следующему обработчику по цепочке.

По метке uninstall осуществляется сохранение используемых далее регистров (что делается скорее для красоты, чем по необходимости) и функцией DOS 25h восстанавливается из ячеек old_09h и old_2Fh ис­ходное содержимое соответствующих векторов. Далее из ячейки со сме­щением 2Ch относительно начала PSP в регистр ES загружается адрес окружения программы. Сегментный адрес освобождаемого блока памя­ти - единственный параметр, требуемый для выполнения функции DOS 49h. Размер освобождаемого блока DOS известен, он хранится в блоке управления памятью (МСВ). Далее освобождается блок памяти с самой программой. Сегментный адрес этого блока (адрес PSP) находится в регистре CS. Наконец, командой iret управление передастся в програм­му, вызвавшую прерывание 2Fh.

Функция 49h оповещает DOS о том, что данный блок памяти сво­боден и может впредь использоваться DOS. Это, однако, не мешает вы­полняться завершающим строкам программы (в данном случае – коман­де iret), поскольку освобождение памяти не разрушает ее содержимого. Наша резидентная программа физически сотрется лишь после того, как в память будет загружена очередная выполняемая программа.

Если программа запускается с клавиатуры с указанием каких-либо параметров (имен файлов, ключей, определяющих режим работы про­граммы и проч.), то DOS, загрузив программу в память, помещает все символы, введенные после имени программы (так называемый хвост команды) в префикс программного сегмента программы, начиная с от­носительного адреса 80h. Хвост команды помещается в PSP во вполне определенном формате. В байт по адресу 80h DOS заносят число сим­волов в хвосте команды (включая пробел, разделяющий на командной строке саму команду и ее хвост). Далее (начиная с байта по адресу 81h) следуют все символы, введенные с клавиатуры до нажатия клавиши . Завершается хвост колом возврата каретки (13).

К данным секции инициализации добавилась строка с ожидаемым хвостом команды и байтовый флаг запроса на выгрузку.

Поскольку действия программы при её запуске зависят от того, вве­дена ли команда запуска с параметром или нет, наличие хвоста в PSP анализируется в самом начале секции инициализации. При запуске программы типа СОМ все сегментные регистры указывают на начало PSP. Байт с длиной хвоста (возможно, нулевой) помещается в регистр CL и сравнивается с нулем. Если в нем 0, команда запуска была введена без параметров и инициализация программы продолжается обычным образом. Если хвост имеет ненулевую длину, начинается его анализ.

Обнулением регистра СН длина хвоста "расширяется" на весь ре­гистр СХ, что нужно для организации цикла. Регистр DI настраивается на первый байт хвоста, а регистр SI – на начало поля tail с ожидаемой формой параметра. Регистр AL подготавливается для выполнения ко­манды сканирования строки. Команда scasb сравнивает в цикле байты хвоста с содержимым AL (кодом пробела). Сравнение ведется до тех пор, пока не будет найден первый символ, отличный от пробела. Эта операция необходима из-за того, что оператор при вводе команды вы­грузки может отделить параметр команды от самой команды любым числом пробелов, которые попадут в хвост команды в PSP и помешают анализировать введенный параметр.

Выход из цикла выполнения команды scasb осуществляется, когда команда проанализировала первый после пробела символ. После этого регистр DI указывает на второй символ параметра. Команда dec DI кор­ректирует указатель DI, направляя его на первый значащий символ вве­денного параметра. Далее командой сравнения строк cmpsb осу­ществляется сравнение трех оставшихся символов хвоста. Если символы совпадают с параметром 'off', записанным в программе, устанавливается флаг запроса на выгрузку. Если результат сравнения оказался отрица­тельным, флаг запроса не устанавливается (и, следовательно, непра­вильный параметр просто не воспринимается). В любой случае осу­ществляется переход на продолжение программы, начинающей прове­рять, не установлена ли уже эта программа в памяти. Если программа еще не установлена, введенный параметр не имеет смысла. Инициали­зация осуществляется обычным образом: сохраняются и устанавливают­ся векторы и программа завершается с оставлением в памяти.

При наличии в памяти резидентной копии этой программы осу­ществляется переход на метку installed, где прежде всего проверяется, установлен ли флаг запроса на выгрузку. Если флаг сброшен, выводится сообщение о невозможности повторной загрузки и программа завер­шается с кодом возврата 1. Если флаг запроса установлен, выполняется выгрузка программы, которая заключается в вызове мультиплексного прерывания 2Fh с функцией F1h и подфункцией 01h. Резидентный об­работчик этого прерывания, включенный в состав нашей резидентной программы, отработает эту подфункцию, восстановит векторы и освободит занятые программой блоки памяти. После возврата управления из обработчика в текущую программу будет выведено сообщение об успешной выгрузке и программа будет завер­шена функцией 4Ch с нулевым кодом возврата.

Составленная нами программа не избавлена от недостатков. Так, в ней анализируются всегда только 3 значащих символа хвоста. Таким об­разом, программа будет выгружена и при вводе команды (имя).com onset. Другой недостаток заключается в том, что результат сравне­ния записанного в программе хвоста с введенным с клавиатуры пара­метром будет положительным, только если с клавиатуры введены строчные буквы. Команда (имя) OFF не приведет к выгрузке про­граммы. По-настоящему следовало включить в программу перед анали­зом хвоста преобразование символов параметра в прописные буквы.

2.4. Перехват прерываний

В архитектуре процессоров 80х86 предусмотрены особые случаи, когда процессор прекращает (прерывает) выполнение текущей программы и немедленно передает управление программе-обработчику, специально написанной для обработки подобной ситуации. Такие особые ситуации делятся на два тина: прерывания и исключения, в зависимости от того, вызвало ли эту ситуацию какое-нибудь внешнее устройство или выполняемая процессором команда. Исключения делят­ся далее на три типа: ошибки, ловушки и остановы, в зависимости от того, когда по отношению к вызвавшей их команде они происходят. Ошибки появляются перед выполнением команды, поэтому обработчик такого исключения получит в качестве адреса возврата адрес ошибочной команды (начиная с процессоров 80286). Ловушки происходят сразу после выполнения команды, так что обработчик получает в качестве адреса возврата адрес следующей команды. И наконец, остановы могут возникать в любой момент и вообще не предусматривать средств возврата управления в программу.

Команда INT (а также INTO и INT3) используется в программах как раз для того, чтобы вызывать обработчики прерываний (или исключений). Фактически они являются исключениями ловушки, поскольку адрес возврата, который передастся обработчику, указывает на следующую команду, но так как эти команды были введены до разделения особых ситуаций на прерывания и исключения, их практически всегда называют командами вызова прерываний. Ввиду того, что обработчики прерываний и исключений в DOS обычно не различают механизм вызова, с помощью команды INT можно передавать управление, как на обработчики прерываний, так и исключений. Как показано в главе 4, программные прерывания, то есть передача управле­ния при помощи команды INT, являются основным средством вызова процедур DOS и BIOS, потому что в отличие от вызова через команду CALL здесь не нужно знать адреса вызываемой процедуры - достаточно только номера. С другой сторо­ны интерфейса рассмотрим, как строится обработчик программного прерывания.

2.5. Обработчики прерываний

Когда в реальном режиме выполняется команда INT, управление передается по адресу, который считывается из специального массива, таблицы векторов пре­рываний, начинающегося в памяти по адресу 0000h:0000h. Каждый элемент тако­го массива представляет собой дальний адрес обработчика прерывания в форма­те сегмент:смещение или 4 нулевых байта, если обработчик не установлен. Команда INT помещает в стек регистр флагов и дальний адрес возврата, поэтому, чтобы завершить обработчик, надо выполнить команды popf и retf или одну ко­манду iret, которая в реальном режиме полностью им аналогична.

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

Хотя прямое изменение таблицы векторов прерываний и кажется достаточно удобным, все-таки это не лучший подход к установке обработчика прерывания, и пользоваться им следует только в исключительных случаях, например, внутри обработчиков прерываний. Для обычных программ DOS предоставляет две сис­темные функции: 25h и 35h - установить и считать адрес обработчика прерыва­ния, которые и рекомендуются к использованию в обычных условиях.

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

2.6. Прерывания от внешних устройств

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

  • IRQ1 (INT 9) - прерывание клавиатуры, вызывается при каждом нажатии и отпускании клавиши на клавиатуре. Стандартный обработчик этого преры­вания выполняет довольно много функций, начиная с перезагрузки по Ctrl-Alt-Del и заканчивая помещением кода клавиши в буфер клавиатуры BIOS.

Самые полезные для программ аппаратные прерывания — прерывания систем­ного таймера и клавиатуры. Так как стандартные обработчики этих прерываний выполняют множество функций, от которых зависит работа системы, их нельзя заменять полностью.

прерванной программе. Этот способ применяют, если нужно, чтобы сначала отработал новый обработчик, а потом он передал управление старому

Резидентные программы, перехватывающие аппаратные прерывания, обладают свойством выполнятся одновременно с какой-либо другой программой. Именно для этого и применяется механизм аппаратных прерываний - они позволяют процессору выполнять одну программу, в то время как отдельные программы следят за временем, считывают символы из клавиату­ры и помещают их в буфер, получают и передают данные через последовательные и параллельные порты и даже обеспечивают многозадачность, переключая про­цессор между разными задачами по прерыванию системного таймера.

Разумеется, обработка прерываний не должна занимать много времени: если прерывание происходит достаточно часто (например, прерывание последователь­ного порта может происходить 28 800 раз в секунду), его обработчик обязательно должен выполняться за более короткое время. Если, например, обработчик пре­рывания таймера будет выполняться 1/32,4 секунды, то есть половину времени между прерываниями, вся система станет работать в два раза медленнее. А если еще одна программа с таким же долгим обработчиком перехватит это прерыва­ние, система остановится совсем. Именно поэтому обработчики прерываний при­нято писать исключительно на ассемблере.

2.7. Резидентный обработчик прерываний от клавиатуры с подключением до системного обработчика

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

Для того чтобы написать, обработчик прерываний от клавиатуры, необходимо хорошо представлять, каким образом вводятся, куда попадают и как обрабатываются символы, вводимые с клавиатуры. Процесс взаимодействия системы с клавиатурой показан на рис. 2.3.

IRQ INT Адрес системного

Характеристики

Тип файла
Документ
Размер
200,5 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7027
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее