Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

5.4. Активизация резидентной программы

Активизация резидентной программы - непростая задача, состоящая из многих шагов.

Когда обработчик прерываний INT 08h или INT 28h обнаруживает, что есть запрос на активизацию и, кроме того, возможность активизации, вызывается функция activate_tsr. Она и выполняет всю необходимую работу.

Переключение стека

Прежде всего, функция activate_tsr переключает стек при помощи функции set_stack. Эта функция составлена на языке ассемблера и приведена в листинге 5.3.

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

Переключение прерываний <Ctrl+Break>, <Ctrl+C> и прерывания по критической ошибке ввода/вывода

Далее функция activate_tsr сохраняет адреса обработчиков прерываний <Ctrl+Break>, <Ctrl+C> и прерывания по критической ошибке ввода/вывода, а затем устанавливает для этих прерываний свои собственные обработчики. Все это необходимо потому, что резидентная программа может обрабатывать перечисленные выше прерывания не так, как это делает прерванная программа.

Переключение PSP

На следующем этапе активизации резидентная программа сохраняет PSP прерванной программы и устанавливает свой PSP. Если этого не сделать, текущий PSP не будет соответствовать текущей выполняемой программе (в данном случае программе TSRDEMO).

Для получения адреса PSP прерванной программы вызывается функция GetPSP.

Если используется MS-DOS версии 2.х, адрес PSP определяется с помощью функции 51h прерывания INT 21h . Для более новых версий можно вызвать функцию 62h того же прерывания.

Установка PSP текущей исполняемой программы выполняется функцией SetPSP с помощью функции 50h прерывания INT 21h .

Переключение DTA

Далее резидентная программа, выполняющая активизацию, должна сохранить область DTA (Disk Transfer Area ) прерванной программы, которая используется при работе с дисковой памятью. Это можно сделать при помощи функции 2Fh прерывания INT 21h .

После этого устанавливается новая область DTA , для которой используется часть сегмента PSP . Установка новой области DTA выполняется функцией 1Ah прерывания INT 21h .

Сохранение расширенной информации об ошибке

Если при выполнении какой-либо функции прерывания INT 21h возникает ошибка, в соответствующую структуру памяти записывается расширенная информация, позволяющая определить причины ее возникновения.

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

Для сохранения информации об ошибке программа TSRDEMO вызывает функцию GetExtErr, которая получает указанную информацию с помощью функции 59h прерывания INT 21h .

Функция SetExtErr восстанавливает расширенную информацию об ошибке при помощи функции 5D0Ah того же самого прерывания.

Удаление содержимого буфера клавиатуры

На последнем этапе активизации наша программа очищает буфер клавиатуры . Это необходимо для того, чтобы коды клавиш, предназначенные для прерванной программы, не были переданы активизированной резидентной программе.

Для удаления содержимого буфера клавиатуры используется функция _bios_keybrd. Она вызывается в цикле до тех пор, пока буфер клавиатуры не окажется пуст:

while(_bios_keybrd(_KEYBRD_READY))
  _bios_keybrd(_KEYBRD_READ);

Вызов функции application

Теперь можно делать то, для чего предназначена резидентная программа. В данном случае, программа TSRDEMO вызывает функцию application, которая копирует содержимое видеопамяти в создаваемый текстовый файл.

Перед вызовом функции application мы выполнили все необходимые действия по переключению активной программы, сохранению структур данных. Кроме того, мы зарезервировали память для области HEAP и стека. Поэтому функция application может вызывать практически любые функции стандартной библиотеки, в том числе предназначенные для динамического выделения памяти и для работы с потоками данных.

Обратное переключение

Сохранив содержимое видеопамяти в файле, функция application возвращает управление функции activate_tsr. Последняя должна очистить буфер клавиатуры , восстановить расширенную информацию об ошибках, область DTA , PSP , адреса прерываний <Ctrl+Break>, <Ctrl+C> и прерывания по критической ошибке ввода/вывода и выполнить обратное переключение стека.

[Назад] [Содеожание] [Дальше]