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

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

.pdf
Скачиваний:
3
Добавлен:
12.08.2022
Размер:
300 Кб
Скачать
☆

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

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

ОТЧЕТ По лабораторной работе № 6

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

Студент гр. 0303

 

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

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

 

 

Губкин А. Ф.

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

2022

Цель работы.

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

не из одного модуля простой структуры. В этом случае разумно предположить,

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

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

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

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

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

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

В качестве вызываемой программы необходимо взять программу ЛР 2,

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

затем происходит обращение к функции выхода 4Сh прерывания int 21h.

2

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

Занесите полученные данные в отчет.

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

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

Занесите полученные данные в отчет.

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

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

 

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

 

•

print _str_

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

•

printl _str_

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

•

printChar _chr_

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

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

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

• endl db 13, 10, '$'

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

• params ParamBlock <?>

3

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

• 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

4

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

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

• 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.

5

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

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

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

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

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

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

6

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

Поведение программы аналогично первому пункту, отличие лишь в том,

что вызываемая программа была завершена прерыванием Ctrl-C.

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

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

7

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

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

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

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

8

Так как динамически запускаемого модуля нет в каталоге с программой,

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

Выводы:

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

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

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

-при нажатии данной комбинации вызывается прерывание 23h ядра DOS

иуправление передаётся инструкции следующей после инструкции загрузки модуля. При загрузке другого модуля в поле PSP «Ctrl-Break Address»

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

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

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

21h

2) В какой точке заканчивается вызываемая программа по прерыванию

Ctrl-C

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

9

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