Системное программное обеспечение персональных ЭВМ


Пример 1



Пример 1

ttttttttTTssssss, где

  • t...t - младшие 8 бит номера дорожки;
  • TT - старшие 2 бита номера дорожки;
  • s...s - номер сектора на дорожке (6 бит).

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

где

  • t, h, s - физический адрес (дорожка, головка, сектор);
  • ns - количество секторов на дорожке,
  • nh - количество головок чтения/записи.

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

Как мы увидим ниже, величины ns, nh, s0 могут быть получены из системной информации, находящейся на самом носителе.

В программе примера 10.1, иллюстрирующей применение средств чтения секторов средствами BIOS и DOS наибольший интерес (кроме вызывающих последовательностей для прерываний) представляют функции Daddr_to_Sect и Sect_to_Daddr, осуществляющие перевод физического адреса в логический и наоборот соответственно. Программа запрашивает способ задания адреса, формирует по заданному физическому адресу логический или наоборот, вводит один и тот же сектор дважды (сначала используя прерывание BIOS, а затем - DOS) и выводит на экран содержимое начального участка сектора, при двух вариантах ввода - результаты должны быть одинаковыми. Физический адрес в программе описывается структурой daddr, поля t, h, s которой содержат компоненты физического адреса, а ts - заготовку для регистра CX при обращении к прерыванию 0x13.

Предупредим читателя, что приведенная программа будет правильно работать только с дискетой, отформатированной на 360 Кбайт, так как величины nh, ns, s0 (параметры формулы 10.1) и другие (nt, nls) имеют константные значения, свойственные именно этому формату.




- Начало -  - Назад -  - Вперед -