Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетУказКурсРабСистемПрогрЗИЭИТ2005.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
698.37 Кб
Скачать

77

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ЗАПОРОЖСКИЙ ИНСТИТУТ ЭКОНОМИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к курсовой работе по дисциплине

«Системное программирование»

для студентов специальности

“Компьютерные информационные системы и сети”

г. Запорожье

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 курса. Выполнение курсовой работы состоит из четырех этапов:

  1. Изучение литературы. Разработка алгоритма. (0,5 месяца)

  2. Написание рабочей версии программной реализации алгоритма. Представление рабочих материалов на бумаге (0,5 месяца).

  3. Разработка и отладка системы и оформление интерфейса пользователя (0,5 месяца).

  4. Оформление, сдача и защита отчета (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- для записи конца).

Сформулируем теперь функции каждого из двух просмотров.

Первый просмотр (определение имен):

  1. Назначение адресов для всех предложений исходной программы.

  2. Запоминание значений (адресов), присвоенных всем меткам, для последующего их использования на втором просмотре.

  3. Выполнение некоторых директив ассемблера.

Второй просмотр (трансляция команд и генерация объектного кода).

  1. Трансляция команд (перевод кодов операций и разрешение адресных ссылок).

  2. Генерация данных, заданных директивами byte, word и др.

  3. Выполнение тех директив ассемблера, которые не были обработаны на первом просмотре.

  4. Запись объектного кода и выдача листинга.

Таблицы и алгоритмы ассемблера.

Простой ассемблер использует две основные внутренние таблицы: таблицу кодов операций (ОРТАВ) и таблицу символических имен (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

Примечание. Необходимо отчетливо представлять смысловое раз­личие двух употреблений термина «смещение». Смещение (displace­ment), содержащееся в команде, интерпретируется как знаковое целое, которое участвует в формировании операционным устройством эффек­тивного адреса 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 (двухбайтное смещение)