
lab6 / 0303_Болкунов_ВО_ЛР6
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра математического обеспечения и применения ЭВМ
ОТЧЕТ По лабораторной работе № 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