Контрольные вопросы. Задания. 11. Резидентные программы. 11. 1 структура резидентной программы
Контрольные вопросы 1. Как можно проверить наличие сопроцессора? 2. Какие числовые и нечисловые регистры содержит процессор? 3. Для чего служит регистр признаков? 4. Какие форматы чисел с плавающей точкой поддерживает сопроцессор? 5. Какие группы команд сопроцессора вы знаете? 6. Для чего перед каждой командой сопроцессора необходимо выполнить команду FWAIT? 7. Почему нельзя корректно вычислить значение выражения вида 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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|
|||||||||||||||||||||||||||||||