Читайте также:
|
|
Програма тестування НГМД складається з двох процедур та головної програми.
Процедура Verif(Ngol,Ndor,Nsek:byte) виконує верифікацію дискети, використовуючи системну функцію 04h переривання 13h, яка була описана вище. Функція Verif реалізована за наступним алгоритмом:
- запис у регістри cl,ch та dh номера сектора, доріжки та голівки відповідно;
……..
reg.cl:=Nsek;
reg.ch:=Ndor;
reg.dh:=Ngol;
….
- посилання у регістр ah номера функції ($04);
reg.ah:=$04;
….
- у регістр dl – номер диска ($00 – диск А) та виклик 13 переривання;
reg.dl:=$00;
intr($13,reg);
- перевірка регістра ah: якщо 1 – то помилка.
Процедура Geom виводить на екран геометрію диска, використовуючи описану вище системну функцію 08h переривання 13h. Алгоритм функції Geom описано нижче:
- у регістр ah – номер системної функції ($08);
reg.ah:=$08;
- у регістр dl – номер диска ($00 – диск А);
reg.dl:=$00;
- виклик 13 переривання;
intr($13,reg);
- вивід на екран кількості голівок, циліндрів та секторів, для цього до значення регістрів dh та ch (які містять інформацію про кількість голівок та циліндрів) додаємо 1, оскільки циліндри та голівки починають рахуватися з 0;
Heads:=reg.dh+1;
Cyls:=reg.ch+1;
Sectors:=reg.cl;
- розрахунок об’єму диска шляхом знаходження добутка між кількістю секторів, доріжок, голівок та розміром сектору (512), та вивід його на екран;
V:=(Heads*Cyls*Sectors*t)/1024;
writeln('объём диска: ',V:11,'Mb');
У головній програмі спочатку викликається функція Geom для отримання інормації про кількість секторів, циліндрів та голівок на диску, після чого вводяться початкові та кінцеві номери діапозону тих голівок, доріжок та секторів, які необхідно перевірити. Далі організовано три цикла: перший для голівок, другий для циліндрів і третій для секторів. Для останнього циклу підраховується кількість проходів шляхом ділення без залишку різниці між кінцевим та початковим номерами діапазону секторів. В ціх циклах викликається процедура Verif за алгоритмом “Метелика”, який був описаний вище.
Перед викликом процедури Verif та після нього викликається функція GetTime(h,m,s,s100), за допомогою якої визначаємо час доступу до сектора.
....
for i:=NgBeg to NgFin do
for j:=NdBeg to NdFin do
begin
k:=((nsfin-nsbeg) div 2)+1;
while k<>0 do
begin
GetTime(h,m,s,s100);
Verif(i,j,nsbeg);
GetTime(hk,mk,sk,s100k);
Verif(i,j,nsfin);
nsbeg:=nsbeg+1;
nsfin:=nsfin-1;
k:=k-1;
end;
end;
writeln('Time: ',sk-s,' sec ',s100k-s100,' Sec/100'); readkey;
End.
ТЕКСТ ПРОГРАМИ.
program testFD;
uses crt,dos;
var
reg:REGISTERS;
NgBeg,NgFin:byte;
NdBeg,NdFin:byte;
NsBeg,NsFin:byte;
i,j,k:integer;
h,m,s,s100,hk,mk,sk,s100k:word;
{процедура перевірки диска}
Procedure Verif(Ngol,Ndor,Nsek:byte);
begin
reg.cl:=Nsek; {отримання номера сектора}
reg.ch:=Ndor; {отримання номера доріжки}
reg.dh:=Ngol; {отримання номера голівки}
reg.ah:=$04; {виклик функції 04h }
reg.dl:=$00; {00 – диск А (01 – В, 80 – С)}
intr($13,reg); {виклик переривання 13h}
{перевірка на помилку}
if reg.ah=1 then writeln('Error ',' Nsek= ',Nsek)
else
writeln('Nsek= ',Nsek,' Ndor= ',Ndor,' Ngol= ',Ngol,' OK');
end;
{Геометрія диска}
Procedure Geom;
var v,t:real;
Heads:byte;
Cyls:byte;
Sectors:byte;
begin
reg.ah:=$08; {виклик функції 08h}
reg.dl:=$00; {диск А}
intr($13,reg); {виклик переривання 13h}
Heads:=reg.dh+1; {кількість голівок}
Cyls:=reg.ch+1; {кількість циліндрів}
Sectors:=reg.cl; {кількість секторів}
writeln('Heads: ',Heads); {вивід кількості голівок}
writeln('Cyls: ',Cyls); {вивід кількості циліндрів}
writeln('Sectors: ',Sectors); {кількість циліндрів}
t:=512;
V:=(Heads*Cyls*Sectors*t)/1024; {розрахунок об’єму диска } writeln('объём диска: ',V:11,'Mb'); {вивід об’єму диска }
end;
{головна програма}
Begin
ClrScr;
Geom;
readkey;
{вводимо параметри діапазону}
writeln('Введите начальный номер головки');
readln(NgBeg);
writeln('Введите конечный номер головки');
readln(NgFin);
writeln('Введите начальный номер цилиндра');
readln(NdBeg);
writeln('Введите конечный номер цилиндра');
readln(NdFin);
writeln('Введите начальный номер сектора');
readln(NsBeg);
writeln('Введите конечный номер сектора');
readln(NsFin);
for i:=NgBeg to NgFin do {цикл для голівок}
for j:=NdBeg to NdFin do {цикл для доріжок}
begin
k:=((nsfin-nsbeg) div 2)+1; {кількість проходів}
for t:=0 to k-1 do {цикл для сеторів}
begin
GetTime(h,m,s,s100); {отримуємо значення часу}
Verif(i,j,nsbeg+t);
GetTime(hk,mk,sk,s100k);
Verif(i,j,NsFin-t);
end;
end;
{визначаємо час доступу до сектора}
writeln('Timeb: ',m,' min ',s,' sec ',s100,' Sec/100');
writeln('Timef: ',mk,' min ',sk,' sec ',s100k,' Sec/100');
readkey;
End.
Результати роботи програми:
Запустимо програму для визначення часу доступу до сектора на одній доріжці
Отримали результат:
Heads: 2
Cyls: 80
Sectors: 18
объём диска: 1.44E+0003Mb
Введите начальный номер головки
Введите конечный номер головки
Введите начальный номер цилиндра
Введите конечный номер цилиндра
Введите начальный номер сектора
Введите конечный номер сектора
Nsek= 3 Ndor= 4 Ngol= 1 OK
Nsek= 6 Ndor= 4 Ngol= 1 OK
Nsek= 4 Ndor= 4 Ngol= 1 OK
Nsek= 5 Ndor= 4 Ngol= 1 OK
Timebeg: 15 min 38 sec 12 Sec/100
Timefin: 15 min 38 sec 29 Sec/100
Тобто бачимо що час доступу складає 17 Sec/100
Також видно що сектори перевіряються за алгоритмом “Метелика”.
Визначимо час доступу до секторів різних доріжок:
Результат:
Введите начальный номер головки
Введите конечный номер головки
Введите начальный номер цилиндра
Введите конечный номер цилиндра
Введите начальный номер сектора
Введите конечный номер сектора
Nsek= 4 Ndor= 2 Ngol= 1 OK
Nsek= 5 Ndor= 2 Ngol= 1 OK
Nsek= 4 Ndor= 3 Ngol= 1 OK
Nsek= 5 Ndor= 3 Ngol= 1 OK
Timebeg: 22 min 59 sec 83 Sec/100
Timefin: 23 min 0 sec 5 Sec/100
Тобто час доступу дорівнює 22 Sec/100.
Визначимо час доступу до секторів різних доріжок
Результат:
Введите начальный номер головки
Введите конечный номер головки
Введите начальный номер цилиндра
Введите конечный номер цилиндра
Введите начальный номер сектора
Введите конечный номер сектора
Nsek= 7 Ndor= 2 Ngol= 0 OK
Nsek= 8 Ndor= 2 Ngol= 0 OK
Nsek= 7 Ndor= 3 Ngol= 0 OK
Nsek= 8 Ndor= 3 Ngol= 0 OK
Nsek= 7 Ndor= 2 Ngol= 1 OK
Nsek= 8 Ndor= 2 Ngol= 1 OK
Nsek= 7 Ndor= 3 Ngol= 1 OK
Nsek= 8 Ndor= 3 Ngol= 1 OK
Timebeg: 24 min 37 sec 22 Sec/100
Timefin: 24 min 37 sec 44 Sec/100
Бачимо, що час доступу – 22 Sec/100.
Одже, виходячи з отриманих результатів роботи програми, можна зробити висновок, що час доступу до сектора на одній доріжці меньший ніж час доступу до сектора на різних доріжках або голівках.
Дата добавления: 2014-12-18; просмотров: 25 | Поможем написать вашу работу | Нарушение авторских прав |