Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧКА СИСТЕМНОЕ ПРОГРАМ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
743 Кб
Скачать
☆

Задания для лабораторной работы:

Применяя прямую запись в видеопамять получить на экране оригинальный, желательно динамический видеоэффект. Возможны такие варианты видеоэффектов:

"теннисный мячик" - шарик, который летает по экрану и отражается от рамок и границ экраны;

"сухой лист" - опадание букв с экрана;

"жук-пожиратель" - фигурка, которая перемещается по экрану по случайной траектории и "съедает" буквы;

"удав" - то же, что и "жук", но к тому же он увеличивается в размерах, по мере "поедания" букв.

Контрольные вопросы:

1. Назовите и опишите основные типы видеоадаптеров.

2. Что такое разрешающая способность?

3. Назовите характеристики видеопамяти.

4. Как считается адрес видеопамяти.

5. Расшифруйте HRGBhrgb?

Лабораторная работа № 15-16

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

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

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

- осуществлять разработку кода программного модуля на современных языках программирования;

- создавать программу по разработанному алгоритму как отдельный модуль;

- выполнять отладку и тестирование программы на уровне модуля

знать:

- основные этапы разработки программного обеспечения;

- основные принципы технологии структурного и объектно-ориентированного программирования;

- основные принципы отладки итестирования программных продуктов

Краткие теоретические и учебно-методические материалы по теме лабораторной работы

Жесткий диск представляет собой два или более дисков, посаженных на одну ось. Все головки чтения/записи здесь, как и для дискеты образуют жесткий блок, то есть перемещаются все вместе. Для жесткого диска вполне органичным является понятие цилиндра - совокупности всех дорожек, расположенных на разных поверхностях и равноудаленных от оси вращения. С точки зрения адресации понятия "дорожка" и "цилиндр" являются синонимами. Сектор является минимальной адресуемой единицей при обращениях к внешней памяти. Адрес сектора на внешней памяти состоит из трех составляющих:

  • номер дорожки (нумерация дорожек начинается с 0);

  • номер головки (нумерация головок начинается с 0);

  • номер сектора на дорожке (нумерация секторов начинается с 1).

В DOS для чтения/записи секторов служат прерывания (прерывания, а не функции DOS!) 0x25 (чтение) и 0x26 (запись). Обычный формат обращения к этим прерываниям следующий:

AL

- номер логического диска (0 - A, 1 - B, 2 - C, etc.);

CX

- количество секторов, которое нужно прочитать /записать; DX - логический номер сектора;

DS:BX

- адрес области оперативной памяти, с которой происходит обмен.

На выходе, как и для прерывания 0x13, устанавливается флаг переноса, а регистр AH содержит код ошибки при наличии таковой. Заметим, что дисковый адрес задается здесь не физический, а логический - номер сектора относительно начала логического диска. Нумерация секторов внутри логического диска начинается с 0, и номер логического сектора может быть вычислен как:

logs = ( (t * ns) + h) * nh + s-1;    (1),

где

  • t, h, s - физический адрес (дорожка, головка, сектор);

  • ns - количество секторов на дорожке,

  • nh - количество головок чтения/записи.

Для получения абсолютного номера сектора надо к вычисленному значению прибавить еще некоторую величину s0 - абсолютный номер сектора начала логического диска.

Некоторые области диска содержат системную информацию, используемую DOS при работе с данным диском. К таким областям относятся:

  • Главная Загрузочная Запись (MBR - Master Boot Record) - только для жесткого диска;

  • Загрузочный Сектор логического диска (Boot-сектор);

  • Таблица Размещения Файлов (FAT - File Allocation Table);

  • Корневой Каталог (Root Directiry).

Пример:

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

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

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

x, y - экpанные кооpдинаты;

head - номеp головки (0);

Sect_Trk - номеp доpожки и сектоpа (0,1);

ndrive=0 - номеp логического диска;

EndList - указатель на подпись.

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

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

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 */

};

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

/* Стандартные заголовки */

#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(" Лабораторная работа ");

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();

}

}

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

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

Лог.диск -----> 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

Задания для лабораторной работы:

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

Контрольные вопросы:

  1. Что такое сектор жесткого диска?

  2. Из чего состоит адрес сектора?

  3. Как считается нумерация секторов диска?

  4. Для чего необходим Boot-сектор?

  5. Для чего необходимо прерывание 0х13?

Лабораторная работа № 17-18

«Получение навыков в работе с таблицей размещения файлов»

Цель работы: получение практических навыков в работе с таблицей размещения файлов.

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

- осуществлять разработку кода программного модуля на современных языках программирования;

- создавать программу по разработанному алгоритму как отдельный модуль;

- выполнять отладку и тестирование программы на уровне модуля

знать:

- основные этапы разработки программного обеспечения;

- основные принципы технологии структурного и объектно-ориентированного программирования;

- основные принципы отладки итестирования программных продуктов.