Контрольные вопросы. Задания. 11. Резидентные программы. 11. 1 структура резидентной программы
Контрольные вопросы 1. Как можно проверить наличие сопроцессора? 2. Какие числовые и нечисловые регистры содержит процессор? 3. Для чего служит регистр признаков? 4. Какие форматы чисел с плавающей точкой поддерживает сопроцессор? 5. Какие группы команд сопроцессора вы знаете? 6. Для чего перед каждой командой сопроцессора необходимо выполнить команду FWAIT? 7. Почему нельзя корректно вычислить значение выражения вида с использованием только команд FYL2X и FSCALE? 8. Каким образом можно вычислить значение выражения вида ?
Задания Вычислите функцию на определенном отрезке, используя команды сопроцессора: а) на отрезке . б) на отрезке . в) на отрезке . г) на отрезке . д) на отрезке . е) на отрезке . ж) на отрезке . з) на отрезке .
11. РЕЗИДЕНТНЫЕ ПРОГРАММЫ
Резидентная программа – это специальная программа, которая после своего завершения оставляет часть своего кода в памяти (резидентная часть) и этот код вызывается при возникновении какого-либо прерывания (аппаратного или программного). Резидентные программы – это единственное исключение, когда в операционной системе MS-DOS «одновременно» могут работать несколько программ. Примерами резидентных программ могут являться загружаемые русификаторы, различные утилиты, которые вызываются при нажатии определенной комбинации клавиш, хранители экрана, резидентные часы и т. д. Полноценная резидентная программа должна иметь средства проверки на повторную загрузку и возможность выгрузки из памяти. Средства проверки на повторную загрузку не дают программе загрузиться в память, если в памяти уже присутствует ее копия, загруженная ранее. Возможность выгрузки программы из памяти обеспечивает в случае необходимости, по команде оператора завершение работы резидентной части программы и выгрузку ее из памяти.
Нерезидентная часть программы обычно выполняет проверку на повторную загрузку, обрабатывает ключи командной строки и оставляет часть кода резидентным в памяти. После этого нерезидентная часть завершается, а в памяти остается резидентная часть. Резидентные программы обычно «перехватывают» вектора прерываний и при возникновении прерывания вместо старого обработчика, вектор которого был перехвачен, используется обработчик резидентной программы. Иногда бывает необходимо помимо выполнения собственного кода резидентной части вызвать и старый обработчик, который может выполнять какие-то стандартные действия для обработки этого прерывания. Резидентная же часть выполняет какие-либо дополнительные действия помимо стандартных. Поскольку резидентная программа должна по возможности обеспечивать выгрузку своего кода из памяти и вызов старого обработчика, перед тем, как «перехватить» вектор прерывания, т. е. перезаписать его новым значением, программа должна сохранить в своих ячейках памяти значение старого вектора прерывания. 11. 1 Структура резидентной программы Как уже было сказано, резидентная программа состоит из двух частей – резидентной и нерезидентной. Резидентная часть, в свою очередь, состоит, по крайней мере, из одной процедуры обработки прерывания. Обычно резидентная часть помимо процедуры обработки прерывания включает в себя и ячейки памяти, в которых хранятся внутренние данные резидентной части или, например, старое значение вектора прерывания. На рис. 9 показана обобщенная структура резидентной программы для операционной системы MS-DOS.
Рис. 9 Обобщенная структура резидентной программы
В зависимости от конкретных требований к резидентной программе некоторые элементы обобщенной структуры могут быть исключены. Минимальная резидентная программа должна содержать хотя бы один обработчик прерывания и процедуру загрузки резидентной части. Реализация структуры резидентной программы во многом зависит от типа программы – COM или EXE. Например, для программ типа EXE стеки резидентной и нерезидентной частей можно оформить в виде отдельных программных сегментов, выровнянных по границе параграфа. Данные резидентной и нерезидентной частей также можно оформить в виде отдельных программных сегментов. Для программы типа COM все элементы обобщенной структуры резидентной программы должны находиться в одном программном сегменте. Это вызывает некоторые сложности при переключении стеков. Далее будут подробно рассмотрены все элементы обобщенной структуры резидентной программы. В стеке резидентной части обычно сохраняются значения используемых регистров при входе в процедуры обработки прерываний, а также промежуточные данные резидентной части. Если в стеке требуется сохранить только значения регистров то, в принципе, можно использовать и стек прерванной программы. Но для повышения надежности работы резидентной программы и для обеспечения ее независимости от других программ все же рекомендуется создать свой собственный стек и выполнить переключение на него. Рассмотрим, как можно выполнить переключение стека для программы типа COM. Вся резидентная программа должна располагаться в одном программном сегменте. Для переключения на стек в COM программе потребуется настроить регистр SS на сегмент кода, т. е. на регистр CS, а в регистр SP занести смещение последнего байта, отведенного под стек. Например:
CODE SEGMENT . . . MyProc PROC MOV CS: OLD_AX, AX; сохранение AX MOV CS: OLD_SS, SS ; сохранение SS MOV CS: OLD_SP, SP ; сохранение SP MOV AX, CS MOV SS, AX ; переключение стека MOV SP, OFFSET Stac + 128 . . . MOV AX, CS: OLD_SS MOV SS, AX ; восстановление стека MOV SP, CS: OLD_SP MOV AX, CS: OLD_AX; восстановление AX IRET MyProc ENDP OLD_SS DW? OLD_SP DW? OLD_AX DW? Stac DB 128 DUP (? ) . . . CODE ENDS В программах типа COM создавать собственный стек для нерезидентной части не нужно.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|