Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
15.04.2015
Размер:
104.96 Кб
Скачать

Резидентные программы

Методические указания к лабораторной работе

Рязань 2008-10-26

1.Введение

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

Такие программы носят название программ, резидентных в памяти. Сделать резидентной можно как программу типа .СОМ, так и программу ти­па .EXE. Программы типа .СОМ компактнее и занимают меньше места в па­мяти, поэтому чаще используются в качестве резидентных.

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

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

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

Запустить резидентную программу можно тремя способами:

  1. с помощью синхронного (программного) прерывания из транзитной программы;

  2. вызвать ее оператором CALL как подпрограмму из транзитной прог­раммы;

  3. использовать механизм асинхронных (аппаратных) прерываний.

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

2. Особенности структуры программы типа com

Существуют определенные различия между программой, выполняемой как EXE-файл и программой, выполняемой как СОМ-файл. Файлы с расширением .СОМ не нуждаются в привязке, поскольку они хранятся в таком виде, что им не требуется фиксация сегмента.

Все в программе хранится относительно начала кодового сегмента, включая все данные и стек. По этой причине программа не может превышать 65535 байт по длине. В файлах с расширением .СОМ все сегментные регис­тры указывают на начало PSP.

Для представления программы в виде файла .СОМ требуется соблюде­ние следующих правил:

1. Поместите в начало программы оператор ORG 100H, который уста­навливает счетчик команд IP на начало кода (программы типа .СОМ начи­наются с относительного адреса 100Н вслед за PSP).

2. Для обхода данных и возможности начать выполнение с любого опе­ратора поместите по адресу 100Н инструкцию JMP.

3. Оператор ASSUME должен устанавливать регистры DS, ES, SS таким образом, чтобы они совпадали со значением кодового сегмента.

4. Данные можно помещать в любом месте программы, но не перемеши­вать с кодом. Лучше начинать программы с области данных, обеспечив об­ход их с помощью оператора JMP.

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

3. Требования к структуре резидентной программы, запускаемой с помощью программного прерывания

Программа должна содержать три смысловые части:

  1. саму процедуру, которая заканчивается командой IRET;

  2. команды инициализации

  3. команды, оставляющие программу резидентной

В инициализирующей части программа должна загрузить адрес процеду­ры (точку входа) в область оперативной памяти, предназначенную для таблицы векторов прерываний. Системой зарезервированы номера прерываний 60Н...66Н , которые могут быть использованы для вызова резидентных программ.

Номеру прерывания соответствует адрес, начиная с которого в оперативной памяти располагается вектор прерывания (адрес точки входа). Каждому вектору выделено 4 байта. Например, если выбран номер пре­рывания - 60Н, то начальный адрес вектора можно вычислить, умножив номер прерывания на четыре ( 60Н * 4 = 180Н ).

Вектор прерывания устанавливается с помощью системной функции 25Н прерывания 21Н. При этом регистр DX должен указывать на смещение про­цедуры в сегменте кода, регистр AL - номер прерывания, а регистр АН - номер функции (25H).

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

Следует учесть, что резидентная часть программы (процедура) дол­жна заканчиваться командой IRET. Эта команда возвращает управление транзитной программе (загружает из стека регистры IP, CS и регистр флагов).

Программа должна завершаться системным прерыванием 27Н. При этом в регистре DX следует указать длину оставляемой в памяти процедуры, а в DS - адрес начала префикса программного сегмента (PSP).

В программах типа .СОМ загрузчик сам устанавливает содержимое ре­гистров CS и DS на начало PSP.

Пример оформления резидентной программы PRER.ASM приведен на рис.1. После загрузки программа передает управление на метку INIT и устанавливает вектор прерывания, который указывает на метку входа в проце­дуру ENTRY.

После установки вектора прерывания программа оставляет себя рези­дентной, указав в DX величину необходимого ей адресного пространства (до метки FINISH). Это пространство операционная система будет защищать при загрузке других программ.

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

Необходимо помнить, что при входе в резидентный обработчик регис­тры CS:IP настроены на адрес входа в процедуру, а все остальные регис­тры как общего назначения, так и сегментные (DS, ES и SS) сохраняют значения, полученные в прерванной программе.

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

Особенно следует обратить внимание на содержимое регистра DS при работе с данными в резидентной программе, т.к. некоторые команды ис­пользуют этот регистр (по умолчанию) при адресации памяти. Чтобы не ошибиться, нужно настроить регистр DS на начало сегмента кода.

В программах типа .СОМ сегмент данных и сегмент кода совпадают. Поэтому достаточно ввести в программу операторы:

... ; В начале процедуры

PUSH DS ; сохранить DS прерванной программы

PUSH CS ; Настроить DS на сегмент

POP DS ; кода

...

POP DS ; Перед выходом из прерывания

; восстановить старое содержимое DS

Пример транзитной программы START.ASM, из которой запускается резидентная PRER.ASM , дан на рис.2. В транзитную программу включена команда INT 60H, которая передает управление в резидентную программу, через вектор прерывания, записанный по адресу 00:180Н.

Соседние файлы в папке Резидентные_программы