 
        
        lab6 / 0303_Болкунов_ВО_ЛР6
.doc
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра математического обеспечения и применения ЭВМ
отчет
По лабораторной работе № 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: запуск в каталоге с модулями (вводится символ)
В данном случае вводится символ i (его код в ASCII таблице соответствует коду возврата). Динамически вызванная программа корректно выводит хвост командной строки, среду и свой путь.
- Запуск в каталоге с разработанными модулями (выход с Ctrl-C) 
Результаты запуска представлены на рисунке 2.
 
Рисунок 2: запуск в каталоге с модулями (ctrl-c)
Поведение программы аналогично первому пункту, отличие лишь в том, что вызываемая программа была завершена прерыванием Ctrl-C.
- Запуск программы в другом каталоге 
Результаты запуска представлены на рисунке 3. Программы также отработали корректно и в новом каталоге.
 
Рисунок 3: запуск в другом каталоге
- Запуск с модулями в разных каталогах 
Результаты запуска представлены на рисунке 4.
 
Рисунок 4: модули в разных каталогах
Так как динамически запускаемого модуля нет в каталоге с программой, его не удалось запустить, вывелась соответствующая ошибка.
Выводы:
В ходе работы были исследованы возможности построения динамически загружаемых модулей. Были написаны и отлажены соответствующие программы загрузочных модулей, находящиеся в одном каталоге, один из которых загружается в процессе работы другого.
Контрольные вопросы
- Как реализовано прерывание Ctrl-C? 
- при нажатии данной комбинации вызывается прерывание 23h ядра DOS и управление передаётся инструкции следующей после инструкции загрузки модуля. При загрузке другого модуля в поле PSP «Ctrl-Break Address» текущего модуля записывается адрес текущего обработчика прерывания, что позволяет корректно восстановить обработчик.
2) В какой точке заканчивается вызываемая программа, если код причины завершения 0?
- в месте вызова функции выхода из программы (функция 4ch прерывания 21h
- В какой точке заканчивается вызываемая программа по прерыванию Ctrl-C 
- в точке исполнения программы в момент вызова прерывания 23h
	
