Справочное описание используемых в программе системных обработчиков, сервисных функций DOS и BIOS. 3
Листинг 6
Задание
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
^
Структурное описание алгоритма
Курсовая работа представляет собой один com-файл, содержащий резидентную часть программы. Программа переопределяет следующие обработчики прерываний: 08h, 09h, 28h, 2Fh, 1Ch, а также содержит процедуру task.
В процедуре task происходит проверка режима экрана и реализация вывода квадрата типа красной дыры. Квадрат при дрейфе по экрану не оставляет за собой шлейфа, так как происходит восстановление прежних атрибутов символов занятых дырой. Для этого перед выводом дыры в новом месте происходит сохранение старых атрибутов. Выход из процедуры осуществляется по нажатию любой из клавиш клавиатуры.
В случае если режим экрана не третий процедура сразу прекращает своё выполнение.
Программы построена таким образом, что возможен запуск процедуры task как с клавиатуры, так и программно по истечению определённого времени, отсчитываемого от последнего нажатия любой клавиши клавиатуры. В случае запуска данной процедуры её повторный запуск невозможен. Для этого в программу введено несколько флагов: task_request -флаг требования запуска процедуры task, task_work - признак запущенной процедуры task.
Обработчик прерывания new_1Ch служит для отсчёта времени отсутствия нажатий на клавиши клавиатуры, для подмены атрибутов символов в окне красной дыры. При достижении определённого времени бездействия клавиатуры происходит установка флага требования запуска процедуры task и признака запущенной процедуры task в 1.
Прикладной обработчик клавиатуры new_09h, устанавливает флаг требования обработки процедуры task и признак запущенной процедуры task в 1 в случаи нажатия комбинации клавиш Alt-A. При нажатий любых других клавиш происходит сброс переменной task_wait и переход в системный обработчик без возврата.
Программы построена с учётом свойств нереентерабельности DOS. Для этого введены обработчики new_08h и new_28h. Прикладной обработчик таймера new_08h служит для активизации процедуры task. Он 18,2 раза в секунду проверяет состояние флагов требования на обработку task_request и флагов занятости DOS. Обработчик прерывания new_28h является активизатором процедуры task во время исполнения функций DOS ввода с клавиатуры. Данный обработчик может инициировать процедуру с использованием функций DOS дисковой группы. Файловая функция вывода 40h будет использоваться с нестандартными дескрипторами клавиатуры
Итак при взведённом флаге требования на обработку task_request (функция аппаратного обработчика 09h, активизируемого клавишной комбинацией Alt-A или функция аппаратного обработчика 1Сh, активизируемого по истечению некоторого времени) исполнение процедуры task по выводу красной дыры на экран монитора с последующим дрейфом осуществляется:
прикладным обработчиком new_28h, когда компьютер не занят исполнением никакой программы и управление передано командному процессору Command.com.
прикладным обработчиком таймера new_08h – во время исполнения какой-либо задачи, использующей функции вывода DOS.
Прикладным обработчиком new_28h – во время ожидания системой ввода символов в командную строку.
^Описание работы программы.
Резидент запускается из командной строки (файл с расширением .com). После проверки на присутствие в памяти первого экземпляра программы, выдается соответствующее сообщение об установке резидента или невозможности его повторной установки. При успешной инсталляции резидента, он будет находиться в «спящем режиме до тех пор, пока не пройдёт определенное в программе количество времени или пользователь не нажмёт комбинацию из клавиш Alt+A. После этих процедур на экране монитора появляется красный квадрат, который движется влево и вправо, при этом подменяя атрибуты находящихся в его области символов на атрибут для отображения красным цветом. Таким образом, в области красного квадрата символы не будут отображаться. Когда красный квадрат перемещается с определённого места, то на месте старого его положения происходит восстановление прежних атрибутов символов. Если пользователь в командной строке вызывает резидент с функцией Off, то произойдёт проверка на наличие резидента в памяти и, если резидент установлен, происходит его удаление из памяти с выводом соответствующего сообщения, в противном случае выводится сообщение об отсутствии резидента в памяти. ^
Описание резидентной части программы.
В секции инициализации выполняется проверка на наличие в памяти первого экземпляра резидента. Если первый экземпляр не обнаружен, то независимо от вида запускающей программу команды (с хвостом или без него) происходит переход на метку ОК с установкой программы в памяти. При обнаружении первого экземпляра программы начинается сравнение хвоста программы с ожидаемым. Если результат сравнения оказался отрицательным, (хвост есть, но другой), программа завершается выводом сообщения о невозможности повторной установки. При идентичности хвоста ожидаемому, резидент выгружается из памяти с выводом соответствующего сообщения. Запуск ^
Справочное описание используемых в программе системных обработчиков, сервисных функций DOS и BIOS.
При помощи инструментального обработчика new_2Fh происходит внутренняя привязка к перехваченному вектору, т.е. данный обработчик реализует функциию проверки наличия в памяти первого экземпляра резидента.
Анализ структуры команды запуска производится в секции инициализации программы. Прежде всего, с помощью функции AX=0C800h прерывания 2Fh выполняется проверка на наличие в памяти первой копии программы. Если она не обнаружена, то независимо от типа запускающей команды (с опцией или нет) происходит переход на метку ОК и установка программы в памяти. В противном случае начинается анализ хвоста команды. Байт с длиной хвоста, находящийся по адресу ES:80h, помещается в регистр CL и сравнивается с нулём. Если в нём 0, команда была без хвоста. В этом случае выводится сообщение о невозможности вторичной установки, и инициализация завершается вызовом функции 4Ch (выход в DOS). Если хвост имеет ненулевую длину, то его длина фиксируется в регистре CX для последующей организации цикла. C помощью строковой команды scasb определяется адрес первого символа хвоста, отличного от нулевого. Далее командой сравнения строк cmpsb осуществляется сравнение трёх оставшихся символов хвоста с опцией ‘off'. Если результат сравнения оказался отрицательным, выполняется переход на завершение программы с предварительным выводом сообщения о невозможности повторной установки. Если введённая команда содержала опцию ‘off’, - в первую копию резидента посылается приказ на выгрузку: прерывание 2Fh с кодом AL=01h. По завершению выгрузки программы из памяти (команда iret процедуры new_2Fh), секция инициализации завершается выводом соответствующего сообщения последующим вызовом функции 4Ch.
^Int 2Fh: мультиплексное прерывание.
Ввод: AH = функция прерывания или идентификатор программы (от 00h доFFh),
00h – 7Fh зарезервировано для DOS/Windows
B8h – BFh зарезервировано для сетевых функций,
C0h – FFh отводится для использования в прикладных программах,
AL = подфункция с кодом 00h – проверка наличия программы в памяти, остальные коды – свои для каждой функции,
^BX, CX ,DX=00h (если через эти регистры происходит возврат заранее обусловленных кодов)
Возврат: если при вызове прерывания Int 2Fh из инициализационной части резидентной программы(AH –принятый идентификатор программы, а AL=00h), происходит возврат в регистре AL значения FFh, то обработчиком обнаружено в памяти установленная ранее копия программы с “нашим” идентификатором. Возврат же с AL=00h – её отсутствие
В системе может быть установлено несколько программ, использующих мультиплексное прерывание 2Fh, поэтому, если обработчик обнаружил в регистре AH “чужую” функцию, то он должен командой
Jmp [dword cs:old_2Fh]
передать управление по цепочке тому обработчику, адрес которого был ранее в векторе 2Fh. В результате вызов int 2Fh из любой программы будет проходить по цепочке через все загруженные резидентные программы, пока не достигнет “своей” (AL=FFh), или при её отсутствии, вернёт управление в вызвавшую программу (инициализационную часть) c AL=00h.
В программе использованы группы функций int 21h (06h,…):
06h – ввод одиночных символов из стандартного устройства ввода и вывод одиночных символов на стандартное устройства вывода.
4Сh- Функция DOS-выход из программы.
49h- Функция освобождения блока памяти Освобождает блок памяти и передаёт его системе.
Вызов: AH=49h,
ES= сегментный адрес освобождаемого блока.
35h. Получение вектора прерывания.
Вызов: AH=35h, AL = номер вектора прерывания.
Возврат: ES:BX = двухсловный адрес (Seg:Offset) обработчика прерываний.
25h. Установка вектора прерывания.
Позволяет заполнить вектор прерывания адресом обработчика прерываний.
Вызов: AH=25h, AL = номер вектора прерывания.
Возврат: DS:BX = двухсловный адрес обработчика прерываний.
Конкретное использование указанных системных средств показано в программе prg1.
функция DOS 31h, которая может использоваться как для Com –, так и exe- программ, оставляет программу резидентной в памяти.
^Int 1Аh, функция 00h. Чтение счетчика циклов таймера.
Обработчик прерывания BIOS от системного таймера (Int 8) подсчитывает количество прерываний (каждые 55 мсек или 18,2 раза в секунду) в двойном слове памяти с адресом 0040h:006Сh. Данная функция возвращает накопленное значение (двоичный код) и сбрасывает его в 0. В регистре AL возвращается 0, если содержимое счетчика не превысило значения, соответствующего 24 часам (при достижении этого значения счетчик сбрасывается), иначе возвращается AL=1.
Вызов: АН = 00h.
Возврат: СХ:DX – число тактов системного времени от полуночи,
AL – флаг перехода через сутки. Int 10h, Функция 0Fh. Получить режим дисплея и номер текущей страницы.
Вызов: AH = 0Fh.
Возврат: AL = режим дисплея, AH= ширина экрана в текстовом формате
BH =номер активной страницы.
Вызов разрушает регистры BP, SI и DI.
Листинг
Похожие:
Программирование драйвера клавиатуры Примечание. Разработанные программы не должны содержать системных вызовов ms-dos и bios, выполняющих информационный обмен с клавиатурой...
М. А. Мунтян политические системы В середине XX века в результате активного использования применявшихся в биологии системных (Л. Берталанфи) и кибернетических (Н....
Краткое описание модулей библиотеки Библиотека "k-lib" содержит 3324 функции в 61 модуле. Названия модулей и функций соответствуют принятым в языке C++ стандартам. Функциональность...