- •Введение
- •Тема 1. Двухпросмотровый ассемблер
- •Тема 2. Com-сервер для обработки и хранения результатов тестирования.
- •Тема 3. Дисковая утилита для просмотра fat.
- •Тема 4. Сервер автоматизации ole.
- •Тема 5. Дефрагментатор файловой системы.
- •Элемент каталога для короткого имени
- •Тема 6. Монитор системных ресурсов для Windows 98/2000.
- •Тема 7. Менеджер процессов и потоков для Windows 98/2000.
- •Тема 8. Файловый менеджер для Windows 98/2000/nt.
- •Тема 9. Формат исполняемого pe-файле в Windows 98/nt.
- •Тема 10. Запуск в определенное время различных программ.
- •Тема 11. Утилита, сохраняющая в файле информацию из системного реестра о программах, установленных на компьтере.
- •Тема 12. Утилита для очистки системного реестра Windows.
- •Тема 13. Утилита, отслеживающая изменения в файловой системе Windows в заданных каталогах.
- •Тема 14. Просмотрщик таблицы разделов и fat.
- •Тема 15. Утилита MaxSplitter
- •Тема 16. Утилита удаленного администрирования.
- •Тема 17. Простая почтовая программа на основе протокола smtp.
- •Тема 18. Ftp - клиент.
- •Тема 19. Ftp - сервер.
- •Тема 20. Системные сервисы Windows nt/2000.
- •Литература
- •Приложение 1. Tcp/ip Программирование с использованием WinSock
- •Создание и использование сокетов
- •Закрытие сокета
- •Функция shutdown()
- •Методы прекращения работы гнезда
- •Функция bind()
- •Приложение может послать запрос на соединение с помощью функции
- •Отправка и прием данных через сокеты потоков
- •Ожидание и обработка событий
- •Использование функции wsaAsyncSelect()
- •Приложение 2. Команды ftp
- •Приложение 3. Команды smtp
- •Приложение 4. Заголовки почты smtp
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ЗАПОРОЖСКИЙ ИНСТИТУТ ЭКОНОМИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к курсовой работе по дисциплине
«Системное программирование»
для студентов специальности
“Компьютерные информационные системы и сети”
г. Запорожье
2005
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 3
Тема 1. Двухпросмотровый ассемблер 4
Тема 2. COM-сервер для обработки и хранения результатов тестирования. 8
Тема 3. Дисковая утилита для просмотра FAT. 9
Тема 4. Сервер автоматизации OLE. 13
Тема 5. Дефрагментатор файловой системы. 13
Тема 6. Монитор системных ресурсов для Windows 98/2000. 16
Тема 7. Менеджер процессов и потоков для Windows 98/2000. 17
Тема 8. Файловый менеджер для Windows 98/2000/NT. 19
Тема 9. Формат исполняемого PE-файле в Windows 98/NT. 23
Тема 10. Запуск в определенное время различных программ. 28
Тема 11. Утилита, сохраняющая в файле информацию из системного реестра о программах, установленных на компьтере. 30
Тема 12. Утилита для очистки системного реестра Windows. 33
Тема 13. Утилита, отслеживающая изменения в файловой системе Windows в заданных каталогах. 33
Тема 14. Просмотрщик таблицы разделов и FAT. 34
Тема 15. Утилита MaxSplitter 34
Тема 16. Утилита удаленного администрирования. 34
Тема 17. Простая почтовая программа на основе протокола SMTP. 37
Тема 18. FTP - клиент. 37
Тема 19. FTP - сервер. 38
Тема 20. Системные сервисы Windows NT/2000. 39
ЛИТЕРАТУРА 52
Приложение 1. TCP/IP Программирование с использованием WinSock 53
Приложение 2. Команды FTP 60
Приложение 3. Команды SMTP 69
Приложение 4. Заголовки почты SMTP 73
Введение
Цель. Курсовая работа по дисциплине «Системное программирование» предназначена для приобретения практических навыков разработки программных проектов, связанных с решением задач системного программирования в среде современных операционых систем.
Курсовая работа требует разработки целостного законченного проекта или проведения исследовательской работы.
Тема. Курсовая работа выполняется по темам, указанным во второй части методических указаний. Тема также может быть выбрана студентом самостоятельно, если она соответствует тематике курсовых работ дисциплины и согласована с преподавателем.
Курсовая работа выполняется студентом индивидуально. Допускается выполнение работы в составе группы - два, три человека при условии увеличения объема работ в соответствующее число раз. Защита при этом проводится с каждым студентом индивидуально по всему объему курсовой работы.
Сроки. Курсовая работа выполняется в течение 2-го семестра 3 курса. Выполнение курсовой работы состоит из четырех этапов:
Изучение литературы. Разработка алгоритма. (0,5 месяца)
Написание рабочей версии программной реализации алгоритма. Представление рабочих материалов на бумаге (0,5 месяца).
Разработка и отладка системы и оформление интерфейса пользователя (0,5 месяца).
Оформление, сдача и защита отчета (0,5 месяца).
Язык реализации – Visual C++ 6.0 или Borland Delphi.
Работа должна продемонстрировать умение: осуществить постановку задачи, преобразовывать задачу в формализованное машинное представление, спроектировать программное обеспечение в современной программной среде, реализовать эффективный интерфейс с пользователем, оформить документацию на программу.
Предпочтителен отчет, подготовленный компьютерным способом. При подготовке отчета следует учитывать требования ЕСПД на программную документацию.
Оценка за курсовую работу учитывает: качество работы программы, стройность и ясность описания (в отчете), ритмичность выполнения работ, устойчивость программы к изменению входных параметров, функциональные возможности программы.
Тема 1. Двухпросмотровый ассемблер
Техническое задание.
Разработать двухпросмотровый ассемблер, реализующий ассемблирование программ, использующих основной набор инструкций микропроцесссора Intel 8086.
Методические указания.
Основные функции ассемблера.
Большинство ассемблеров выполняет два просмотра исходной программы. Основной задачей первого просмотра является поиск символических имен и назначение им адресов.
Основное назначение ассемблеров состоит в трансляции, т.е. переводе мнемонических кодов операций в их эквиваленты на машинном языке.
Пример mov ax, 4 B8 0004
int 10h cd 10
push es 06
mov bl, 50 b3 32
Ассемблер наряду с трансляцией команд исходной программы должен также выполнять и также выполнять и так называемые директивы ассемблера. Эти директивы не переводятся непосредственно в машинные команды, а управляют работой самого ассемблера.
В заключительной фазе своей работы ассемблер должен записать полученный объектный код на некоторое устройство вывода. Позднее эта объектная программа будет загружена в оперативную память для исполнения.
Для представления учебной объектной программы иногда используется простой формат, в котором определены три типа записей: запись-заголовок, тело программы и запись-конец. Запись-заголовок содержит имя программы её начальный адрес и длину. Тело программы содержит машинные команды и данные программы с указанием адресов их загрузки. Запись-конец отмечает конец объектной программы и определяет адрес, с которого следует начать исполнение программы (точку входа). (если этот адрес не задан, то в качестве точки входа берется адрес первой исполняемой команды). В каждой записи первым полем является признак типа записи (Head- для записи заголовка, Code- для тела программы, End- для записи конца).
Сформулируем теперь функции каждого из двух просмотров.
Первый просмотр (определение имен):
Назначение адресов для всех предложений исходной программы.
Запоминание значений (адресов), присвоенных всем меткам, для последующего их использования на втором просмотре.
Выполнение некоторых директив ассемблера.
Второй просмотр (трансляция команд и генерация объектного кода).
Трансляция команд (перевод кодов операций и разрешение адресных ссылок).
Генерация данных, заданных директивами byte, word и др.
Выполнение тех директив ассемблера, которые не были обработаны на первом просмотре.
Запись объектного кода и выдача листинга.
Таблицы и алгоритмы ассемблера.
Простой ассемблер использует две основные внутренние таблицы: таблицу кодов операций (ОРТАВ) и таблицу символических имен (SYMТAB).
ОРТАВ используется для поиска мнемонических кодов операций и перевода их в эквивалентные им представления на машинном языке.
SYMТAB используется для хранения значений (адресов), присвоенных символическим именам.
Ещё нам потребуется счетчик адреса (LOCCTR). LOCCTR - это переменная, которая используется для назначения адресов. Начальное значение LOCCTR определяется операндом директивы ORG. После обработки очередного предложения исходной программы длина полученной команды или области данных прибавляется к LOCCTR. Таким образом, если мы встречаем помеченное предложение исходной программы, то значение этой метки определяется текущим значением LOCCTR.
Таблица кодов операций должна, по крайней мере, содержать мнемонические коды операций и их машинные эквиваленты. В более сложных ассемблерах эта таблица, кроме того, содержит информацию о длине и формате каждой команды. Во время первого просмотра ОРТАВ используется для поиска и проверки корректности задания кодов операций в исходной программе. Во время второго просмотра она используется для перевода мнемонических кодов в их машинное представление. Обычно ОРТАВ организуется в виде хеш-таблицы, в которой в качестве ключа используется мнемонический код операции.
В большинстве случаев ОРТАВ представляет собой статическую таблицу, т.е. в процессе работы в ней не создаются новые элементы, а уже определенные не исключаются. В этом случае можно построить специальную хеш-функцию, обеспечивающую для конкретного набора ключей оптимальное время доступа. Однако чаще всего используются стандартные хеш-функции.
Таблица имен (SYMТAB) состоит из имен и значений (адресов) всех меток исходной программы вместе с признаками, указывающими на ошибку (например, дважды определенное имя). Эта таблица может также содержать информацию о типе, длине и других характеристиках помеченной области данных или команды. Во время первого просмотра все встретившиеся в исходной программе имена вместе с их адресами (они определяются по LOCCTR) сразу заносятся в SYMТAB. Во время второго просмотра имена, используемые в качестве операндов, ищутся в SYMТAB и соответствующие им адреса используются для генерации команд.
Для повышения эффективности поиска и внесения новых имен SYMТAB на протяжении всей работы ассемблера требует тщательного подбора хеш-функции. Очень часто программисты используют много похожих друг на друга имен, например LOOP1, LOOP2, … или имена, имеющие одинаковую длину (A, X, Y, Z). Важно, чтобы используемая хеш-функция обеспечивала хорошую работу с такими неслучайными именами. Часто хороший результат достигается путем деления входного ключа на простое число, равное длине таблицы.
Хотя в качестве входной информации на этапе второго просмотра можно использовать исходную программу, однако, должна быть, учтена и информация первого просмотра создается промежуточный файл, который содержит с его адресом, признаком ошибки и другой необходимой информацией. Промежуточный файл является входным второго просмотра. Рабочая копия исходной программы, содержащаяся в промежуточном файле, может быть использована для того, чтобы сохранить результаты некоторых операций, выполненных во время первого просмотра (например, операции сканирования поля операндов для определения имен и способов их адресации). Это дает возможность не выполнять их ещё раз при втором просмотре. Аналогично для кодов операций и имен могут быть сохранены указатели на таблицы ОРТАВ и SYMТAB, что позволит избежать повторных операций поиска.
Режимы адресации
При выполнении любой программы процессор обращается к памяти, в которой хранятся команды и данные. В командах преобразований данных определяются адреса, которые указывают местоположение необходимых данных, а в командах передачи управления определяются адреса команд, которым передается управление, т.е. адреса переходов. Способ, или метод определения в команде адреса операнда или адреса перехода, называется режимом адресации или просто адресацией.
В наиболее простом режиме адресации, называемом прямой адресацией, адрес находится в самой команде. Однако использование этого режима, хотя и предусмотрено в большинстве современных процессоров, приводит к чрезмерной длине команд, особенно в условиях постоянно увеличивающейся емкости памяти. Поэтому в настоящее время в процессорах применяется много других режимов адресации, направленных на достижение следующих целей:
определение адреса памяти наименьшим числом бит, что сокращает длину команд
вычисление адреса относительно текущей команды (так называемая относительная адресация), обеспечивающее загрузку программ без модификации в любую область памяти;
осуществление доступа к ячейкам памяти, адреса которых вычисляются при выполнении программы, что упрощает доступ к регулярным структурам данных;
оперирование адресами в такой форме, которая наиболее удобна для таких структур данных, как массивы и стеки.
Для современных процессоров разработано более двух десятков режимов адресации, которые в той или иной степени удовлетворяют приведенным выше требованиям. Режимы адресации значительно расширяют гибкость и удобство пользования системой команд.
Назначением режима адресации является указание способа формирования эффективного (или исполнительного) адреса ЕА. Этот адрес является либо адресом операнда (в командах, оперирующих данными), либо адресом перехода (в командах передачи управления). В МП Intel 8086 эффективный адрес памяти представляет собой 16-битное беззнаковое целое, являющееся смещением относительно базы некоторого сегмента. Полный (физический) адрес памяти формируется с привлечением одного из сегментных регистров.
Режимы адресации подразделяются на прямые и косвенные. При прямой адресации эффективный адрес либо содержится в команде, либо вычисляется с использованием значения, находящегося в команде, и содержимого, указанного в команде регистра (или двух регистров). При косвенной адресации эффективный адрес в команде определяет регистр или ячейку памяти, содержащую окончательный эффективный адрес.
Как уже отмечалось, МП Intel 8086 имеет организацию чипа «регистр - память». С точки зрения адресации это означает, что его команды адресуют максимум два операнда и что нe допускается одновременная адресация двух ячеек памяти. Первым операндом в двухоперандной (или двухадресной) команде обычно является содержимое регистра или ячейки памяти, а вторым—содержимое регистра или непосредственный операнд в команде. Ниже будет показано, что приведенная нумерация («первый» и «второй» операнды) в MП Intel 8086 является довольно условной и при желании может быть изменена.
Наиболее общий формат двухоперандной команды приведен на рис. 1
КОП d w mod reg r/m dispL dispH
Рис. 1. Двухоперандная команда (второй операнд - регистр)
Первый байт команды содержит код операции КОП и два однобитных поля — направления d и слова w. Поле d определяет направление передачи: если d = l, то направление в МП, а если d=0, то направление из MП. Само направление относится ко второму операнду - регистру, определяемому полем reg второго байта команды. Этот байт называется постбайтом (или просто байтом) режима адресации. Поле w идентифицирует тип (размер) операнда: если w=1, команда оперирует словом, а если w = 0, - байтом. Таким образом, в зависимости от значений полей d и w имеются четыре возможности:
d w Передача или операция
0 0 Байт из регистра в память или регистр
0 1 Слово из регистра в память или регистр
1 0 Байт в регистр из памяти или регистра
1 1 Слово в регистр из памяти или регистра
Участвующие в операции регистры или регистр и ячейку памяти идентифицирует постбайт, состоящий из трех полей: mod - режим, reg - регистр и r/m - регистр/память. Поле reg определяет второй операнд, обязательно находящийся в регистре. Способ кодирования внутренних регистров МП в поле reg представлен в табл. 1
Из табл. 1 видно, что регистры данных АХ - DX, a также указательные и индексные регистры SP, ВР, SI, DI адресуются одинаковым образом.
Таблица 2.3. Адресация внутренних регистров МП
Поле reg (и r/т) |
8 - битные регистры |
16 – битные регистры |
000 |
AL |
АХ |
001 |
CL |
СX |
010 |
DL |
DX |
011 |
BL |
BX |
100 |
AH |
SP |
101 |
CH |
BP |
110 |
DH |
SI |
111 |
BH |
DI |
Данное обстоятельство подчеркивает правомерность объединения всех этих регистров в группу общих регистров.
Поле mod определяет используемый режим адресации. В частности, оно показывает, как интерпретируется поле r/т для нахождения первого операнда. Если mod = 11, операнд содержится в регистре, а в остальных случаях первый операнд находится в памяти. Когда поле mod содержит 11 (регистровая адресация), поле r/т определяет 8- или 16-битный регистр в соответствии с табл. 1. В остальных случаях адресуется память, и поле mod определяет, как используется (необязательное) смещение disp, находящееся во втором и третьем байтах команды:
mod = 100, disp = 0 - смещение отсутствует;
mod = 01, disp = dispL - команда содержит 8-битное смние, которое расширяется со знаком до 16 бит;
mod = 10, disp = disH, dispL - команда содержит два байта смещения.
В этом же случае (mod не равно 11) косвенной адресации поле r/т определяет, каким образом формируется эффективный адрес операнда. Кодирование поля r/т представлено в табл. 2.
Приведенные правила имеют только одно исключение: если mod = 00 и г/m = 110, то EA = dispH, dispL. Здесь в команде содержится абсолютный адрес памяти.
Таким образом, операнд в памяти можно адресовать прямо (16-битное смещение) или косвенно (с 8- или 16-битным смещением). Во втором случае память можно адресовать через базовый регистр (ВР или BX), через индексный регистр (SI или DI), а также через комбинацию базового и индексного регистров.
Таблица 2. Формирование эффективного адреса памяти
Поле r/m |
Эффективный адрес |
000 001 010 011 100 101 110 111
|
EA = (BX) + (SI) + disp EA = (BX) + (DI) + disp EA = (BP) + (SI) + disp EA = (BP) + (DI) + disp EA = (SI) + disp EА = (DI) + disp ЕA = (BР) + disp EA = (BX) + disp |
Всего получается 24 режима адресации памяти - три способа интерпретации поля mod и восемь способов интерпретации поля r/т.
Суммарные сведения о постбайтных режимах адресации МП Intel 8086 сведены и табл.3
Примечание. Необходимо отчетливо представлять смысловое различие двух употреблений термина «смещение». Смещение (displacement), содержащееся в команде, интерпретируется как знаковое целое, которое участвует в формировании операционным устройством эффективного адреса EA. С другой стороны, из-за сегментной организации памяти весь эффективный адрес является смещением (offset) относительно базового адреса сегмента и интерпретируется как беззнаковое целое. Физический адрес памяти формирует шинный интерфейс.
Таблицa 3. Постбайтные режимы адресации
r /т |
mod |
||||
00 |
01 |
10 |
11 |
||
000 001 010 011 100 101 110 111
|
(BX)+(SI) (BХ)+(DI) (BP) +(SI) (BP)+(DI) (SI) (DI) (D16) (BX)
|
(BX)+(S1)+D8 (BX)+(DI)+D8 (BP)+(SI)+D8 (BP)+(DI)+D8 (SI)+D8 (DI) + D8 (BP) + D8 (BX)+ D8
|
(BX)+(SI)+D16 (BX)+(DI)+D16 (BP)+(SI)+D16 (BP)+(DI)+D16 (SI)+D16 (DI)+16 (BP)+D16 (BX)+D16
|
w=0 |
w=1 |
AL CL DL BL AH CH DH BH |
AX CX DX BX SP BI SI DI |
D8 = dispL (однобайтное смещение) D16 = dispH, dispL (двухбайтное смещение)