Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5.3. Результаты работы программы

В процессе работы программы на экран выводится информация такого вида:

Лабораторная работа N8

Главная загрузочная запись

Разделы жесткого диска:

Лог.диск -----> C Ext E Ext G

Признак ------> 80H 00H 00H 00H 00H

Код системы --> 1 5 4 5 0

Начало: гол.--> 1 0 1 0 1

дор.--> 0 121 121 724 724

сект.-> 1 1 1 1 1

Конец: гол.--> 4 4 4 4 4

дор. -> 120 975 723 975 975

сект.-> 17 17 17 17 17

Нач.сектор ---> 17 10285 17 51255 17

Размер -------> 10268 72675 51238 21420 21403

Нажмите любую клавишу...

Лабораторная работа № 9. Дисковые структуры данных DOS

1. Цель работы

Получение практических навыков в работе с Таблицей Размещения Файлов.

2. Темы для предварительного изучения

  • Внешняя память на магнитных дисках.

  • Физический дисковый адрес.

  • Логическая структура диска.

  • Таблица Размещения Файлов (FAT) жесткого диска.

3. Постановка задачи

Определить номера всех кластеров диска, которые занимает заданный преподавателем файл в текущем каталоге.

4. Порядок выполнения

Порядок выполнения работы и содержание отчета определены в общих указаниях.

5. Пример решения задачи

5.1. Разработка алгоритма решения

5.1.1. Структура программы

Программа состоит из главной функции main() и одиннадцати вспомогательных функций.

  • void Read_Mbr(void) - функция чтения MBR и поиска требуемого раздела.

  • void Read_Boot(void) - функция чтения boot-сектора.

  • void Get_First(void) - функция определения абсолютного номера сектора начала логического диска.

  • void Read_Fat(void) - функция чтения FAT.

  • void Read_13(void *mem) - функция чтения сектора с помощью прерывания 13.

  • void Sect_to_Daddr(dword sect) - функция формирования физического дискового адреса из номера сектора.

  • dword Clust_to_Sect(word clust) - функция определения номера сектора по номеру кластера.

  • word Next_Clust(word clust) - функция выборки следующего кластера из FAT.

  • char *Get_Name(char *s, char *d) - функция выделения следующего элемента из строки-задания.

  • int Find_Name() - функция поиска имени в каталоге.

  • void End_of_Job(int n) - функция выдачи сообщений или аварийного завершения.

5.1.2. Описание переменных

В программе описаны структуры такого вида:

Физический дисковый адрес:

struct DADDR {

byte h; /* головка */

word s, /* сектор */

t, /* дорожка */

ts; /* сектор, дорожка упакованные */

};

Структура элемента раздела;

struct PART {

byte Boot, /* признак активного */

/* физический адрес начала раздела */

Begin_Hd; /* # головки */

word Begin_SecTrk; /* # сектора и дорожки */

byte SysCode, /* код системы */

/* физический адрес конца раздела */

End_Hd; /* # головки */

word End_SecTrk; /* # сектора и дорожки */

dword RelSec, /* # сектора початку */

Size; /* количество секторов */

};

Стpуктуpа Главной Загрузочной Записи:

struct MBR

{

char LoadCode[0x1be]; /* программа загрузки */

struct PART rt[4]; /* 4 элемента разделов */

word EndFlag; /* подпись MBR */

};

Структура загрузочной записи логического диска:

struct BootRec {

byte jmp[3], ident[8];

word SectSize;

byte ClustSize;

word ResSect;

byte FatCnt;

word RootSize, TotSecs;

byte Media;

word FatSize, TrkSecs, HeadCnt;

word HidnSecL, HidnSecH;

dword LongTotSecs;

byte Drive, reserved1, DOS4_flag;

dword VolNum; char VolLabel[11], FatForm[8];

};

Структура элемента каталога:

struct Dir_Item {

char fname[11]; /* имя файла */

byte attr; /* атрибут */

byte reserved[10];

word time; /* время */

word date; /* дата */

word cl; /* номер 1-го кластера */

dword size; /* размер файла */

};

Переменные, глобальные для всей программы:

  • part - текущий элемент раздела;

  • buff1[512] - буфер MBR и boot;

  • *mbr - указатель на таблицу разделов;

  • *boot - указатель на корневую запись;

  • buff2[512] - буфер каталога и текста;

  • *dir - указатель на часть каталога;

  • *text - указатель на текстовый буфер;

  • *fat - указатель на FAT;

  • job[81] - строка-задание;

  • jobptr - текущий указатель в job;

  • cname[12] - текущее имя для поиска;

  • Fdisk - физический номер диска;

  • caddr - текущий дисковый адрес;

  • sect - текущий номер сектора;

  • clust - текущий номер кластера;

  • fat16 - признак формата FAT;

  • fsize - размер файла;

  • dirnum - номер элемента в каталоге;

  • FirstSect - абсолютный номер сектора начала;

  • rootdir=1 - признак корневого каталога или подкаталога (1/0);

  • lastsect - последний сектор при чтении;

  • fatalloc=0 - признак выделения памяти.