MetodUkОС. Методические указания к лабораторным работам по дисциплине "Операционные системы " СанктПетербург 2011 введение
Скачать 289.53 Kb.
|
Контрольные вопросы по лабораторной работе №5 1) Какого типа прерывания использовались в работе? 2) Чем отличается скан код от кода ASCII? ЛАБОРАТОРНАЯ РАБОТА № 6 «Построение модуля динамической структуры» Цель работы: Исследование возможности построения загрузочного модуля динамической структуры. В отличии от предыдущих лабораторных работ в этой работе рассматривается приложение, состоящее из нескольких модулей, а не из одного модуля простой структуры. В этом случае разумно предположить, что все модули приложения находятся в одном каталоге и полный путь в этот каталог можно взять из среды, как это делалось в работе 2. Понятно, что такое приложение должно запускаться в соответствии со стандартами ОС. В работе исследуется интерфейс между вызывающим и вызываемым модулями по управлению и по данным. Для запуска вызываемого модуля используется функция 4B00h прерывания int 21h. Все загрузочные модули находятся в одном каталоге. Необходимо обеспечить возможность запуска модуля динамической структуры из любого каталога. Порядок выполнения работы Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет функции: 1) Подготавливает параметры для запуска загрузочного модуля из того же каталога, в котором находится он сам. Вызываемому модулю передается новая среда, созданная вызывающим модулем и новая командная строка. 2) Вызываемый модуль запускается с использованием загрузчика. 3) После запуска проверяется выполнение загрузчика, а затем результат выполнения вызываемой программы. Необходимо проверять причину завершения и, в зависимости от значения, выводить соответствующее сообщение. Если причина завершения 0, то выводится код завершения. В качестве вызываемой программы необходимо взять программу ЛР 2, которая распечатывает среду и командную строку. Эту программу следует немного модифицировать, вставив перед выходом из нее обращение к функции ввода символа с клавиатуры. Введенное значение записывается в регистр AL и затем происходит обращение к функции выхода 4Сh прерывания int 21h. Шаг 2. Запустите отлаженную программу, когда текущим каталогом является каталог с разработанными модулями. Программа вызывает другую программу, которая останавливается, ожидая символ с клавиатуры. Введите произвольный символ из числа A-Z. Посмотрите причину завершения и код. Занесите полученные данные в отчет. Шаг 3. Запустите отлаженную программу, когда текущим каталогом является каталог с разработанными модулями. Программа вызывает другую программу, которая останавливается, ожидая символ с клавиатуры. Введите комбинацию символов Ctrl-C. Посмотрите причину завершения и код. Занесите полученные данные в отчет. Шаг 4. Запустите отлаженную программу, когда текущим каталогом является какой- либо другой каталог, отличный от того, в котором содержатся разработанные программные модули. Повторите ввод комбинаций клавиш. Занесите полученные данные в отчет. Шаг 5. Запустите отлаженную программу, когда модули находятся в разных каталогах. Занесите полученные данные в отчет. Необходимые сведения для составления программы Для загрузки и выполнения одной программы из другой используется функция 4B00h прерывания int 21h (загрузчик ОС). Перед обращением к этой функции необходимо выполнить следующие действия: 1) Подготовить место в памяти. При начальном запуске программы ей отводится вся доступная в данный момент память OS, поэтому необходимо освободить место в памяти. Для этого можно использовать функцию 4Ah прерывания int 21h. Эта функция позволяет уменьшить отведенный программе блок памяти. Перед вызовом функции надо определить объем памяти, необходимый программе ЛР6 и задать в регистре ВХ число параграфов, которые будут выделяться программе. Если функция 4Ah не может быть выполнена, то устанавливается флаг переноса CF=1 и в АХ заносится код ошибки: 7 - разрушен управляющий блок памяти; 8 - недостаточно памяти для выполнения функции; 9 - неверный адрес блока памяти. Поэтому после выполнения каждого прерывания int 21h следует проверять флаг переноса CF=1. 2) Создать блок параметров. Блок параметров - это 14-байтовый блок памяти, в который помещается следующая информация: dw сегментный адрес среды dd сегмент и смещение командной строки dd сегмент и смещение первого FCB dd сегмент и смещение второго FCB Если сегментный адрес среды 0, то вызываемая программа наследует среду вызывающей программы. В противном случае вызывающая программа должна сформировать область памяти в качестве среды, начинающуюся с адреса кратного 16 и поместить этот адрес в блок параметров. Командная строка записывается в следующем формате: первый байт - счетчик, содержащий число символов в командной строке, затем сама командная строка, содержащая не более 128 символов. На блок параметров перед загрузкой вызываемой программы должны указывать ES:BX. 3) Подготовить строку, содержащую путь и имя вызываемой программы. В конце строки должен стоять код ASCII 0. На подготовленную строку должны указывать DS:DX. 4) Сохранить содержимое регистров SS и SP в переменных. При восстановлении SS и SP нужно учитывать, что DS необходимо также восстановить. Когда вся подготовка выполнена, вызывается загрузчик OS следующей последовательностью команд: mov AX,4B00h int 21h Если вызываемая программа не была загружена, то устанавливается флаг переноса CF=1 и в AX заносится код ошибки: 1 - если номер функции неверен; 2 - если файл не найден; 5 - при ошибке диска; 8 - при недостаточном объеме памяти; 10 - при неправильной строке среды; 11 - если не верен формат. Если CF=0, то вызываемая программа выполнена и следует обработать ее завершение. Для этого необходимо воспользоваться функцией 4Dh прерывания int 21h. В качестве результата функция возвращает в регистре AH причину, а в регистре AL код завершения. Причина завершения в регистре AH представляется следующими кодами: 0 - нормальное завершение; 1 - завершение по Ctrl-Break; 2 - завершение пo ошибке устройства; 3 - завершение по функции 31h, оставляющей программу резидентной. Код завершения формируется вызываемой программой в регистре AL перед выходом в OS с помощью функции 4Ch прерывания int 21h. В качестве вызываемой программы целесообразно использовать программу, разработанную в Лабораторной работе №2, модифицировав ее следующим образом. Перед выходом из программы перед выполнением функции 4Ch прерывания int 21h следует запросить с клавиатуры символ и поместить введенный символ в регистр AL, в качестве кода завершения. Это можно сделать с помощью функции 01h прерывания int 21h. mov AH,01h int 21h Введенный символ остается в регистре AL и служит аргументом для функции 4Ch прерывания int 21h. Контрольные вопросы по лабораторной работе №6 1) Как реализовано прерывание Ctrl-C? 2) В какой точке заканчивается вызываемая программа, если код причины завершения 0? 3) В какой точке заканчивается вызываемая программа по прерыванию Ctrl-C? ЛАБОРАТОРНАЯ РАБОТА № 7 «Построение модуля оверлейной структуры» Цель работы: Исследование возможности построения загрузочного модуля оверлейной структуры. Исследуется структура оверлейного сегмента и способ загрузки и выполнения оверлейных сегментов. Для запуска вызываемого оверлейного модуля используется функция 4B03h прерывания int 21h. Все загрузочные и оверлейные модули находятся в одном каталоге. В этой работе также рассматривается приложение, состоящее из нескольких модулей, поэтому все модули помещаются в один каталог и вызываются с использованием полного пути. Порядок выполнения работы Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет функции: 1) Освобождает память для загрузки оверлеев. 2) Читает размер файла оверлея и запрашивает объем памяти, достаточный для его загрузки. 3) Файл оверлейного сегмента загружается и выполняется. 4) Освобождается память, отведенная для оверлейного сегмента. 5) Затем действия 1)-4) выполняются для следующего оверлейного сегмента. Шаг 2. Также необходимо написать и отладить оверлейные сегменты. Оверлейный сегмент выводит адрес сегмента, в который он загружен. Шаг 3. Запустите отлаженное приложение. Оверлейные сегменты должны загружаться с одного и того же адреса, перекрывая друг друга. Шаг 4. Запустите приложение из другого каталога. Приложение должно быть выполнено успешно. Шаг 5. Запустите приложение в случае, когда одного оверлея нет в каталоге. Приложение должно закончиться аварийно. Шаг 6. Занесите полученные результаты в виде скриншотов в отчет. Оформите отчет в соответствии с требованиями. Необходимые сведения для составления программы Для организации программы, имеющей оверлейную структуру, используется функция 4B03h прерывания int 21h. Эта функция позволяет в отведенную область памяти, начинающуюся с адреса сегмента, загрузить программу, находящуюся в файле на диске. Передача управления загруженной программе этой функцией не осуществляется и префикс сегмента программы (PSP) не создается. Обращение к функции 4B03h: AX=4B03h - код функции; DS:DX - указывает на строку ASCIIZ, содержащую путь к оверлею; ES:BX - указатель на блок параметров, который представляет собой два слова памяти, содержащих сегментный адрес загрузки программы. Если флаг переноса CF=1 после выполнения функции, то произошли ошибки и регистр AX содержит код ошибки. Значение регистра AX характеризует следующие ситуации: - 1 - несуществующая функция; - 2 - файл не найден; - 3 - маршрут не найден; - 4 - слишком много открытых файлов; - 5 - нет доступа; - 8 - мало памяти; - 10 - неправильная среда. Если флаг переноса CF=0, то оверлей загружен в память. Перед загрузкой оверлея вызывающая программа должна освободить память по функции 4Ah прерывания int 21h. Затем определить размер оверлея. Это можно сделать с помощью функции 4Eh прерывания 21h. Перед обращением к функции необходимо определить область памяти размером в 43 байта под буфер DTA, которую функция заполнит, если файл будет найден. Функция использует следующие параметры: CX - значение байта атрибутов, которое для файла имеет значение 0; DS:DX - указатель на путь к файлу, который записывается в формате строки ASCIIZ. Если флаг переноса CF=1 после выполнения функции, то произошли ошибки и регистр AX содержит код ошибки. Значение регистра AX характеризует следующие ситуации: - 2 - файл не найден; - 3 - маршрут не найден. Если CF=0, то в области памяти буфера DTA со смещением 1Ah будет находится младшее слово размера файла, а в слове со смещением 1Ch - старшее слово размера памяти в байтах. Полученный размер файла следует перевести в параграфы, причем следует взять большее целое числа параграфов. Затем необходимо отвести память с помощью функции 48h прерывания 21h. После этого необходимо сформировать параметры для функции 4B03h и выполнить ее. После отработки оверлея необходимо освободить память с помощью функции 49h прерывания int 21h. Обращение к этой функции содержит следующие параметры: AH=49h - код функции; ES - сегментный адрес освобождаемой памяти. Оверлейный сегмент не является загрузочным модулем типов .СОМ или .ЕХЕ. Он представляет собой кодовый сегмент, который оформляется в ассемблере как функция с точкой входа по адресу 0 и возврат осуществляется командой RETF. Это необходимо сделать, потому что возврат управления должен быть осуществлен в программу, выполняющую оверлейный сегмент. Если использовать функции выхода 4Сh прерывания int 21h, то программа закончит свою работу. Контрольные вопросы по лабораторной работе №7 1) Как должна быть устроена программа, если в качестве оверлейного сегмента использовать .СОМ модули? Литература Р. Джордейн. Справочник программиста. - М., «Финансы», 1991г. Рудаков П.И, Финогенов К.Г. Язык ассемблера: уроки программирования. – М.; «Диалог-МИФИ», 2001, 640с. http://www.cyberdengi.com/FoundationsOfAssembler/Theme01.html http://www.codenet.ru/progr/dos/int_0009.php |