Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab6 / 0303_Болкунов_ВО_ЛР6

.doc
Скачиваний:
0
Добавлен:
12.08.2022
Размер:
253.44 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра математического обеспечения и применения ЭВМ

отчет

По лабораторной работе № 6

по дисциплине «Операционные системы»

Тема: Построение модуля динамической структуры

Студент гр. 0303

Болкунов В.О.

Преподаватель

Губкин А. Ф.

Санкт-Петербург

2022

Цель работы.

Исследование возможности построения загрузочного модуля динамической структуры. В отличии от предыдущих лабораторных работ в этой работе рассматривается приложение, состоящее из нескольких модулей, а не из одного модуля простой структуры. В этом случае разумно предположить, что все модули приложения находятся в одном каталоге и полный путь в этот каталог можно взять из среды, как это делалось в работе 2. Понятно, что такое приложение должно запускаться в соответствии со стандартами ОС. В работе исследуется интерфейс между вызывающим и вызываемым модулями по управлению и по данным. Для запуска вызываемого модуля используется функция 4B00h прерывания int 21h. Все загрузочные модули находятся в одном каталоге. Необходимо обеспечить возможность запуска модуля динамической структуры из любого каталога

Порядок выполнения работы.

Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет функции:

1) Подготавливает параметры для запуска загрузочного модуля из того же каталога, в котором находится он сам. Вызываемому модулю передается новая среда, созданная вызывающим модулем и новая командная строка.

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

3) После запуска проверяется выполнение загрузчика, а затем результат выполнения вызываемой программы. Необходимо проверять причину завершения и, в зависимости от значения, выводить соответствующее сообщение. Если причина завершения 0, то выводится код завершения.

В качестве вызываемой программы необходимо взять программу ЛР 2, которая распечатывает среду и командную строку. Эту программу следует немного модифицировать, вставив перед выходом из нее обращение к функции ввода символа с клавиатуры. Введенное значение записывается в регистр AL и затем происходит обращение к функции выхода 4Сh прерывания int 21h.

Шаг 2. Запустите отлаженную программу, когда текущим каталогом является каталог с разработанными модулями. Программа вызывает другую программу, которая останавливается, ожидая символ с клавиатуры. Введите произвольный символ из числа A-Z. Посмотрите причину завершения и код. Занесите полученные данные в отчет.

Шаг 3. Запустите отлаженную программу, когда текущим каталогом является каталог с разработанными модулями. Программа вызывает другую программу, которая останавливается, ожидая символ с клавиатуры. Введите комбинацию символов Ctrl-C. Посмотрите причину завершения и код. Занесите полученные данные в отчет.

Шаг 4. Запустите отлаженную программу, когда текущим каталогом является какой-либо другой каталог, отличный от того, в котором содержатся разработанные программные модули. Повторите ввод комбинаций клавиш. Занесите полученные данные в отчет.

Шаг 5. Запустите отлаженную программу, когда модули находятся в разных каталогах. Занесите полученные данные в отчет.

Выполнение работы.

Макроопределения:

  • print _str_ - вывод строки на экран

  • printl _str_ - вывод строки на экран с переводом строки

  • printChar _chr_ - вывод одного символа на экран

Использованная память (данные):

Символы перевода строки

  • endl db 13, 10, '$'

Блок параметров

        • params ParamBlock <?>

Название динамически загружаемого модуля

        • moduleName db "lab2.com$"

Строка для полного имени модуля

        • fullName db 128 dup (0)

Строки с информацией о работе программы

        • memCompSuccess db "Memory compressed successfully.$"

        • launchInfo db "Launching module: $"

        • mcbDestroyed db "error code 7: MCB destroyed$"

        • notEnoughMem db "error code 8: Not enough memory$"

        • mcbIncorrect db "error code 9: Incorrect MCB address$"

        • funNumbErr db "error code 1: Incorrect function number$"

        • fileErr db "error code 2: File is not found$"

        • diskErr db "error code 5: Disk error$"

        • memErr db "error code 8: Not enough memory$"

        • envErr db "error code 10: Incorrect environment string$"

        • fmtErr db "error code 11: Incorrect format$"

        • defalt db "exit cause: Default termination$"

        • ctrlBr db "exit cause: Ctrl + Break was pressed$"

        • devErr db "exit cause: Device error$"

        • resident db "exit cause: Program stayed as resident$"

        • exitCode db "Exit code: $"

        • numStr db 64 dup(0)

Сегмент стека и указатель на вершину (в сегменте кода, т.к. при выходе

из запущенного модуля останется нетронутым только CS)

        • keepSs dw 0

        • keepSp dw 0

Функции, процедуры и структуры:

Стурктура блока параметров

  • ParamBlock struct

    envSeg dw ?

    cmdAddr dd ?

    fcb1Addr dd ?

    fcb2Addr dd ?

ParamBlock ends

Перевод половины байта в строку

  • tetrToHexStr proc

Перевод байта в строку

  • byteToHexStr proc near uses di _num: byte, _buff: word

Обрезка числа в строке по его размеру

  • cutNum proc near uses di _buff: word, _len: word, _base: byte

Сборка полного имени запускаемого модуля

  • buildModuleName proc near uses es di bx

Запуск динамически загружаемого модуля

  • launchModule proc near uses bx es si di bp

Сборка

Загрузочный модуль собирается из файла lab6.asm с помощью утилит “masm”, “link” и “exe2bin”, для автоматизации сборки написан скрипт build.bat. Динамически загружаемый модуль собирается из файла lab2.asm, соответственно его сборочный скрипт: build_lab2.bat.

  1. Запуск в каталоге с разработанными модулями (вводится символ)

Пример запуска показан на рисунке 1.

Рисунок 1: запуск в каталоге с модулями (вводится символ)

В данном случае вводится символ i (его код в ASCII таблице соответствует коду возврата). Динамически вызванная программа корректно выводит хвост командной строки, среду и свой путь.

  1. Запуск в каталоге с разработанными модулями (выход с Ctrl-C)

Результаты запуска представлены на рисунке 2.

Рисунок 2: запуск в каталоге с модулями (ctrl-c)

Поведение программы аналогично первому пункту, отличие лишь в том, что вызываемая программа была завершена прерыванием Ctrl-C.

  1. Запуск программы в другом каталоге

Результаты запуска представлены на рисунке 3. Программы также отработали корректно и в новом каталоге.

Рисунок 3: запуск в другом каталоге

  1. Запуск с модулями в разных каталогах

Результаты запуска представлены на рисунке 4.

Рисунок 4: модули в разных каталогах

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

Выводы:

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

Контрольные вопросы

  1. Как реализовано прерывание Ctrl-C?

- при нажатии данной комбинации вызывается прерывание 23h ядра DOS и управление передаётся инструкции следующей после инструкции загрузки модуля. При загрузке другого модуля в поле PSP «Ctrl-Break Address» текущего модуля записывается адрес текущего обработчика прерывания, что позволяет корректно восстановить обработчик.

2) В какой точке заканчивается вызываемая программа, если код причины завершения 0?

- в месте вызова функции выхода из программы (функция 4ch прерывания 21h

  1. В какой точке заканчивается вызываемая программа по прерыванию Ctrl-C

- в точке исполнения программы в момент вызова прерывания 23h

9

Соседние файлы в папке lab6