КаталогИндекс раздела
НазадОглавлениеВперед


Лабораторная работа N8
ГЛАВНАЯ ЗАГРУЗОЧНАЯ ЗАПИСЬ

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

Получение практических навыков в работе с Главной Загрузочной Записью жесткого диска.

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

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

Прочитать и выполнить форматный вывод на экран Главной Загрузочной Записи жесткого диска на своем рабочем месте.

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

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

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

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

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

Программа состоит из основной программы main(), которая реализует все действия для чтения Главной Загрузочной Записи.

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

Переменные в основной программе:

Кроме того, в программе есть такие структуры:

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

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

Начальный адрес для чтения задается: 0,0,1. При помощи прерывания 0x13 программа считывает сектор по заданному адресу, далее происходит поэлементный анализ таблицы разделов - пока не встретится признак конца таблицы или раздел нулевого размера. Значения полей элемента таблицы выводятся на экран. Манипуляции, которые описываются макросами TRK и SECT, обеспечивают распаковку номера дорожки и сектора. Если в поле SysCode содержится признак расширенного раздела, то устанавливается новый дисковый адрес, считывается новый сектор и анализируется новая таблица.

5.2. Текст программы

/*----------------Лабораторная работа 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();
    }
}

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

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


КаталогИндекс раздела
НазадОглавлениеВперед