- •Резидентные программы
- •1.Введение
- •2. Особенности структуры программы типа com
- •3. Требования к структуре резидентной программы, запускаемой с помощью программного прерывания
- •4. Требования к структуре резидентной программы, запускаемой командой call
- •5. Последовательность выполнения работы
- •5.1 Изучение взаимодействия резидентной и транзитной программ через прерывание.
- •5.2. Изучение взаимодействия резидентной и транзитной программ через область межзадачных связей
- •6. Выполнить самостоятельно следующее задание.
- •Тексты программ
Резидентные программы
Методические указания к лабораторной работе
Рязань 2008-10-26
1.Введение
Программы, обеспечивающие функционирование вычислительной системы, должны постоянно находиться в памяти и мгновенно реагировать на запросы пользователя или на какие-то события, происходящие в вычислительной системе.
Такие программы носят название программ, резидентных в памяти. Сделать резидентной можно как программу типа .СОМ, так и программу типа .EXE. Программы типа .СОМ компактнее и занимают меньше места в памяти, поэтому чаще используются в качестве резидентных.
Программа, которая остается резидентной, обычно содержит процедуру и инициализирующую часть, которая должна записать в определенном месте оперативной памяти адрес точки входа в процедуру и оставить процедуру резидентной в оперативной памяти после загрузки.
В тексте программы процедура размещается в начале, инициализирующая - за ней. Следует отметить, что после загрузки программы резидентной остается только процедура, а инициализирующая часть отбрасывается.
Для того чтобы активизировать резидентную программу, ей надо передать управление, и в некоторых случаях параметры.
Запустить резидентную программу можно тремя способами:
с помощью синхронного (программного) прерывания из транзитной программы;
вызвать ее оператором CALL как подпрограмму из транзитной программы;
использовать механизм асинхронных (аппаратных) прерываний.
В каждом случае следует соблюдать правила оформления резидентной программы.
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. Требования к структуре резидентной программы, запускаемой с помощью программного прерывания
Программа должна содержать три смысловые части:
саму процедуру, которая заканчивается командой IRET;
команды инициализации
команды, оставляющие программу резидентной
В инициализирующей части программа должна загрузить адрес процедуры (точку входа) в область оперативной памяти, предназначенную для таблицы векторов прерываний. Системой зарезервированы номера прерываний 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Н.
