Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Описание алгоритма программы




Эта программа демонстрирует разделение логического диска.

Начальный адрес для чтения задается: 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.
Дисковые структуры данных DOS


Цель работы

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

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

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

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

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

Программа состоит из главной функции 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...