Ассемблер (assembler). Разработка резидентых обработчиков
Рефераты >> Программирование и компьютеры >> Ассемблер (assembler). Разработка резидентых обработчиков

1. Задание

Разработать резидент-замедлитель исполнения программ. Замедление реализуется процедурой задержки, вставленной в обработчик прерывания пользователя по таймеру (int 1Ch). Инициализация резидента осуществляется через посредство комбинации клавиш <Scroll Lock+Цифровая клавиша>. Значение символа цифровой клавиши влияет на скорость замедления.

2. Структура и описание разработки

Вся разработка состоит из двух файлов: *.com - непосредственно резидента и *.exe - демонстрационной программы. Рассмотрим сначала структуру и принцип действия резидента. В состав *.com файла входят следующие обработчики: пользовательский обработчик new_1Ch, заменяющий прерывание 1Сh, пользовательский обработчик клавиатуры new_09h, заменяющий системный обработчик 09h, а также обработчик new_2Fh, заменяющее соответствующее прерывание. Также в файле находятся дополнительные поля и методы, необходимые для корректного функционирования резидента.

Рассмотрим работу пользовательского прикладного обработчика прерываний new_1Ch, заменяющего на время работы резидента прикладной аппаратный обработчик прерываний DOS Int 1Ch, входящего в состав системного обработчика BIOS 08h Прерывание DOS Int 1Ch служит для перехвата тактов системного таймера (18,206 Гц), не нарушая его работу, и изначально содержит лишь одну команду Iret. Новый обработчик содержит алгоритм замедления исполнения программ, основывающийся на том факте, что прерывание 1Ch вызывается примерно 18 раз в секунду. Получается, каждый вызов происходит примерно через каждые 55 мс. Таким образом можно для замедления исполнения программ пропускать каждые n-е вызовы, а остальные задерживать специальным алгоритмом. Получаем замедлитель в n раз исполнения программ, где n- это коэффициент замедления, который регулируется переменной cnt, которая находится в кодовом сегменте. Эта переменная может принимать значения от 0 до 8. Следует добавить, что обработчик new_1Ch несёт ещё одну функцию – демонстрационную. Он выводит на экран не замедленное системное время. Это означает, что в каком ни было режиме замедления обработчик не находился бы, на экране будет отображаться системное время. Рассмотрим теперь работу алгоритма задержки. При очередном вызове обработчика new_1Ch происходит проверка режима работы замедлителя. Режим работы характеризуется состоянием переменной fn, находящейся в кодовом сегменте. Эта переменная может принимать значения от 0 до 8. Значение переменной “0” соответствует “скрытому” режиму работы, при котором на экран не выводится системное время, а так же не происходит никакого замедления. Значения переменной от 1 до 8 характеризуют соответствующий коэффициент задержки при выводимом на экран системном времени. Итак, при установлении режима работы резидента ( по умолчанию идёт 0 ), происходит выставление в переменную cnt, хранящуюся там же коэффициента замедления, а так же по режиму работы определяется выводить или нет на экран системного времени. Коэффициент замедления – это количество вызовов процедуры задержки исполнения программы, время исполнения которой примерно равно 55 мс. Далее происходит анализ переменной f1 на тот факт, что производит на этот раз: проход на Iret, или же производить задержку исполнения. Если fn==0, то идём на выход и выставляем fn=1, если же fn==1, то запускаем алгоритм задержки с возможностью вывода системного или без оного. По завершению работы алгоритма fn выставляется в 0, т.е. при следующем вызове обработчика задержки происходить не будет.

Стоит заметить, что переменная fn, характеризующая режим работы резидента находится хоть и сегменте кода, но не в пределах функции new_1Ch, а вне её. Это необходимо для общедоступности этой переменной, т.к. её использует пользовательский обработчик new_09h для выставления режима работы, а так же обработчик new_2Fh для считывания его.

Теперь рассмотри работу пользовательского обработчика прерываний от клавиатуры new_09h. Проанализируем введённый символ с клавиатуры, если он принадлежит заданному диапазону значений, то продолжим, иначе передадим управление системному обработчику, адрес которого изначально был сохранён. Если всё нормально, то проверяем, включён ли режим Scroll Lock, если нет , то на выход, иначе выставляем в переменной соответствующий номер режима, восстанавливаем все регистры и выходим из обработчика.

Мультиплексное прерывание new_2Fh работает по следующему принципу: сначала проверяется содержимое регистра ax на запрос режима работы резидента, если такой запрос имеет место, то возвращается содержимое переменной fn в том же регистре и происходит выход из процедуры. Если такого запроса не поступило, то происходи анализ того же регистра на наличие нашей функции в памяти. Стоит отметить, что функцией присвоен идентификатор 0C88h. При наличие резидента в памяти произойдёт возвращение в младшем байте регистра ax значения 0ffh. Если и этого запроса не поступило, то проверяется наличие запроса на деинсталляцию. При положительном результате происходит восстановление всех ранее перехваченных векторов и выгрузка из памяти резидента вместе с PSP. При отсутствии всех выше перечисленных запросов произойдёт переход в следующий по цепочке обработчик.

В секции инициализации Init Выполняется проверка на наличие в памяти первого экземпляра резидента. Если первый экземпляр не обнаружен, то независимо от вида запускающей программу команды ;(с опцией или без неё) происходит переход на метку ОК с установкой программы в памяти. При обнаружении первого экземпляра программы начинается сравнение опции команды с ожидаемой. Если результат сравнения оказался отрицательным (опция есть, но другая), программа завершается выводом сообщения о невозможности повторной установки. При идентичности опции ожидаемой резидент выгружается из памяти с выводом соответствующего сообщения.

Демонстрация работы резидента основывается на показательном сравнении “заторможенного” и “не заторможенного” системного времени. “Заторможенное” системное время получается в результате работы резидента. При этом происходит задержка вывода времени на экран. “Не заторможенное” время выводится непосредственно прикладным обработчиком 1Ch. Дело в том, что какой бы то ни было коэффициент замедления не был установлен, время в любом случае будет выводится на экран, так как функция вывода системного времени установлена в алгоритме замедления, суть которого заключается в многократном вызове циклов (порядка не скольких сотен тысяч раз в секунду). Таким образом можно сравнить реально идущее время с заторможенным, а так же можно не вооруженным глазом определить коэффициент замедления.

Весь интерфейс демонстрационной программы оформлен в псевдографике, имеет несколько информационных окон – статус резидента, «заторможенное время», «незаторможенное время», коэффициент замедления.

3. Результаты демонстрации программы.

При запуске .com программы из командной строки было выведено соответствующее сообщение об удачной загрузке резидента в память. При повторном запуске .com приложения было выведено сообщение, что резидент уже загружен. Для дальнейшего продолжения демонстрации работы запустили демонстрационную программу со специальным экранным интерфейсом, в котором отображалось состояние резидента. В окне Статус высвечивается статус резидента, в После предварительного включения режима Scroll Lock последовательно жмём на цифровые клавиши, при этом начинает изменяться информация о состоянии резидента. Заметим, что по умолчанию резидент находился в “скрытом” состоянии, что характеризовалось отсутствием выводимого системного времени на экране, а так же коэффициентом замедления 1. Стоит отметить, что изменение коэффициента замедление не происходит мгновенно, а только в зависимости от предыдущего значения коэффициента замедления


Страница: