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

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

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

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

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

ОТЧЕТ По лабораторной работе № 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