Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Описание алгоритма программы
Эта программа демонстрирует разделение логического диска. Начальный адрес для чтения задается: 0,0,1. При помощи прерывания 0x13 программа считывает сектор по заданному адресу, далее происходит поэлементный анализ таблицы разделов — пока не встретится признак конца таблицы или раздел нулевого размера. Значения полей элемента таблицы выводятся на экран. Манипуляции, которые описываются макросами TRK и SECT, обеспечивают распаковку номера дорожки и сектора. Если в поле SysCode содержится признак расширенного раздела, то устанавливается новый дисковый адрес, считывается новый сектор и анализируется новая таблица. Текст программы /*-------Практическая работа N8----------------*/ /*---"Главная загрузочная запись"--------------*/ /* Стандартные заголовки */ #include <dos.h> #include <conio.h>
/* Типы данных */
#define byte unsigned char #define word unsigned int #define dword unsigned long void read_MBR(void); /* Чтение MBR */ /* Получение из упакованного SecTrk # сектора */ #define SECT(x) x&0x3f /* Получение из упакованного SecTrk # дорожки */ #define TRK(x) (x>>8)|((x<<2)&0x300)
/* структура элемента раздела */ struct Part { byte ActFlag; /* признак активного раздела */ /* физический адрес начала раздела */ byte Begin_Hd; /* # головки */ word Begin_SecTrk; /* # сектора и дорожки */ byte SysCode; /* код системы */ /* физический адрес конца раздела */ byte End_Hd; /* # головки */ word End_SecTrk; /* # сектора и дорожки */ dword RelSec; /* # сектора початку */ dword Size; /* количество секторов */ }; /* стpуктуpа главной загрузочной записи */ struct MBR { char LoadCode[0x1be]; /* пpогpамма загрузки */ struct Part rt[4]; /* 4 эл-та pазделов */ word EndFlag; /* подпись MBR */ } mbr; /* дополнительные переменные */ int x=10,y; /* экpанные кооpдинаты */ byte head=0; /* номеp головки (0) */ word Sect_Trk=1; /* номеp доpожки и сектоpа (0,1) */ int ndrive=0; /* номеp логического диска */ word *EndList; /* указатель на подпись */ union REGS rr; struct SREGS sr; word i; /*-----------------------------------------------*/ main() { textbackground(0); clrscr(); textattr(0x0a); cprintf(" Практическая работа N8"); gotoxy(1,2); cprintf(" Главная загрузочная запись"); textattr(12); gotoxy(30,4); cprintf("Разделы жесткого диска:\n"); gotoxy(1,6); textattr(11); cprintf("Лог.диск -----> \n\r"); cprintf("Признак ------> \n\r"); cprintf("Код системы --> \n\r"); cprintf("Начало: гол.--> \n\r"); cprintf(" дор.--> \n\r"); cprintf(" сект.-> \n\r"); cprintf("Конец: гол.--> \n\r"); cprintf(" дор. -> \n\r"); cprintf(" сект.-> \n\r"); cprintf("Нач.сектор ---> \n\r"); cprintf("Размер -------> \n\r"); textcolor(11); NEXT: read_MBR(); for (EndList=(word *)&mbr.rt[(i=0)]; (*EndList!=0xaa55)&&(mbr.rt[i].Size>0L); EndList=(word *)&mbr.rt[++i]) { /* кооpдинаты куpсоpа */ y=6; x+=7; gotoxy(x,y++); if (mbr.rt[i].SysCode==5) {textattr(13); cprintf("Ext ");
} else textattr(12); cprintf("%-7c",'C'+ndrive++);
gotoxy(x,y++); textattr(14); cprintf("%02xH ",mbr.rt[i].ActFlag); gotoxy(x,y++); textattr(15); cprintf("%-7d",mbr.rt[i].SysCode); gotoxy(x,y++); textattr(14); cprintf("%-7d",mbr.rt[i].Begin_Hd); gotoxy(x,y++); textattr(15); cprintf("%-7u",TRK(mbr.rt[i].Begin_SecTrk)); gotoxy(x,y++); textattr(14); cprintf("%-7u",SECT(mbr.rt[i].Begin_SecTrk)); gotoxy(x,y++); textattr(15); cprintf("%-7d",mbr.rt[i].End_Hd); gotoxy(x,y++); textattr(14); cprintf("%-7u",TRK(mbr.rt[i].End_SecTrk)); gotoxy(x,y++); textattr(15); cprintf("%-7u",SECT(mbr.rt[i].End_SecTrk)); gotoxy(x,y++); textattr(14); cprintf("%-7lu",mbr.rt[i].RelSec); gotoxy(x,y++); textattr(15); cprintf("%-7lu",mbr.rt[i].Size); if (mbr.rt[i].SysCode==5) { /* если код системы 5, pаздел содержит свою таблицу pазделов; определяется ее дисковый адpес, и новая таблица считывается в память */ head=mbr.rt[i].Begin_Hd; Sect_Trk=mbr.rt[i].Begin_SecTrk; goto NEXT; } } gotoxy(x,y++); textattr(10+128); gotoxy(29,18);
cprintf("Нажмите любую клавишу..."); getch(); }
/*-----------Читання MBR------------------------*/ void read_MBR(void) { rr.h.ah=2; /* Чтение */ rr.h.al=1; /* Секторов 1 */ rr.h.dl=0x80; /* Жесткий диск */ rr.h.dh=head; /* Головка */ rr.x.cx=Sect_Trk; /* Дорожка, сектор */ sr.es=FP_SEG(&mbr); /* Адрес буфера в ОП */ rr.x.bx=FP_OFF(&mbr); int86x(0x13,&rr,&rr,&sr); /* Проверка ошибок чтения */ if (rr.x.cflag) { printf("Ошибка чтения: %x. ",rr.h.ah); printf("Нажмите любую клавишу...\n\7"); getch(); exit(); } } Результаты работы программы В процессе работы программы на экран выводится информация такого вида: Практическая работа 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. Цель работы Получение практических навыков в работе с Таблицей Размещения Файлов. Постановка задачи Определить номера всех кластеров диска, которые занимает заданный преподавателем файл в текущем каталоге. Пример решения задачи Разработка алгоритма решения Программа состоит из главной функции main() и одиннадцати вспомогательных функций. u void Read_Mbr(void) — функция чтения MBR и поиска требуемого раздела. u void Read_Boot(void) — функция чтения boot-сектора. u void Get_First(void) — функция определения абсолютного номера сектора начала логического диска. u void Read_Fat(void) — функция чтения FAT. u void Read_13(void *mem) —функция чтения сектора с помощью прерывания 13. u void Sect_to_Daddr(dword sect) — функция формирования физического дискового адреса из номера сектора. u dword Clust_to_Sect(word clust) — функция определения номера сектора по номеру кластера. u word Next_Clust(word clust) — функция выборки следующего кластера из FAT. u char *Get_Name(char *s, char *d) — функция выделения следующего элемента из строки-задания. u int Find_Name() —функция поиска имени в каталоге. u void End_of_Job(int n) — функция выдачи сообщений или аварийного завершения. Описание переменных В программе описаны структуры такого вида: Физический дисковый адрес: 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; /* размер файла */ }; Переменные, глобальные для всей программы: u part — текущий элемент раздела; u buff1[512] — буфер MBR и boot; u *mbr — указатель на таблицу разделов; u *boot — указатель на корневую запись; u buff2[512] — буфер каталога и текста; u *dir — указатель на часть каталога; u *text — указатель на текстовый буфер; u *fat — указатель на FAT; u job[81] — строка-задание; u jobptr — текущий указатель в job; u cname[12] — текущее имя для поиска; u Fdisk — физический номер диска; u caddr — текущий дисковый адрес; u sect — текущий номер сектора; u clust — текущий номер кластера; u fat16 — признак формата FAT; u fsize — размер файла; u dirnum — номер элемента в каталоге; u FirstSect — абсолютный номер сектора начала; u rootdir=1 — признак корневого каталога или подкаталога (1/0); u lastsect — последний сектор при чтении; u fatalloc=0 — признак выделения памяти. |
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 192. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |