Системное программное обеспечение персональных ЭВМ


Инициализация программы


15.2. Инициализация программы

TSR-программа запускается так же, как и любая другая программа. Но те действия, для которых она предназначена, программа должна выполнять не при запуске, а по прерыванию или по нажатию "горячей клавиши". Таким образом, действия, выполняемые при запуске программы должны только обеспечить условия для ее оставления резидентной и ее последующего функционирования в качестве резидентной. В нашем примере эти действия организуются функцией main, которая получает управление при запуске программы. Прежде всего программа должна проверить, не присутствует ли уже ее копия в памяти. Такую проверку выполняет функция check_tsr, которая будет нами подробно рассмотрена при обсуждении программных коммуникаций. В нашей программе предусмотрены два варианта запуска: запуск без параметров - для инициализации программы и запуск с параметром "/Q" - для выгрузки из памяти ранее загруженной копии программы. Функция main анализирует параметр и сопоставляет способ запуска с результатом проверки, произведенной функцией check_tsr. Если при запуске без параметров обнаруживается, что копия программы уже есть в памяти, то инициализация не производится. Если программа запущена с параметром, то для выгрузки TSR-программы происходит обращение к прерыванию 0x2F, которое также будет рассмотрено при обсуждении программных коммуникаций.

Если нет препятствий для инициализации программы, происходит обращение к функции get_context (рессматривается при обсуждении переключения контекстов), затем программа освобождает свой блок окружения, устанавливает свои векторы обрабатываемых прерываний (функция set_vectors - рассматривается при обсуждении обработки прерываний) и получает адрес флажка занятости DOS. Функция DOS 0x34 возвращает в регистрах ES:BX адрес переменной DOS, которая называется флажком занятости (ее использование рассматривается при обсуждении условий активизации).

Для завершения программы используется функция DOS 0x31 - "Завершить и оставить резидентной". Этой функции в регистре AL передается код завершения (как при завершении по функции 0x4C), а в DX - размер в параграфах той части программы, которая остается резидентной в памяти. При программировании на языке Ассемблера для программиста не представляет труда определение этого размера. При программировании на языке высокого уровня точно определить требуемый минимальный размер практически невозможно. Мы взяли размер, равный размеру EXE-файла, этот размер мог бы быть уменьшен, это уменьшение обя- зательно необходимо учитывать при формировании указателя стека (см.функцию get_context), окончательное значение размера подбирается методом проб и ошибок.

Другой способ оставить программу резидентной - прерывание 0x27, но функция DOS 0x31 предпочтительнее, она - более позднее средство, полностью перекрывающее возможности прерывания 0x27.



Содержание раздела