5.1.6. Int 25h/26h - Прямой обмен с диском

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

 

      Вход: AL = номер диска (0=A, 1=B, ...)

            CX = количество секторов

            DX = номер начального логического сектора

            DS:BX = адрес буфера обмена

 

      Выход: AX = код ошибки, если бит CF=1

             все регистры, кроме CS, DS, ES, SS и SP, разрушены

             стек содержит лишнее слово

 

      Эти прерывания обеспечивают прямой  доступ к любому сектору

 диска,находящемуся в  разделе ДОС. Int  25h читает сектора,  Int

 26h их записывает.

 

      Логические сектора  ДОС начинаются с  загрузочного сектора,

 имеющего номер 0, и возрастают последовательно для всех секторов

 цилиндра,  затем для  каждой  головки,  и, наконец,  для каждого

 цилиндра.  Для  вычисления  номера  логического  сектора следует

 пользоваться следующей формулой:

 

      Log_Sector = (Sector - 1) + Head * Sectors_per_Head +

                   Cylinder * Sectors_per_Head * Heads_per_Disk

 

 где Head,  Cylinder, Sector - номер  головки, цилиндра и сектора

 на цилиндре соответственно:

      Sectors_per_Head - количество секторов на одну головку;

      Heads_per_Disk - количество головок дисковода.

 

      В частности, логический сектор 0 - это сектор 1, цилиндра 0

 головки 0. Ошибки, возникающие  в Int 25h/26h, не обрабатываются

 диспетчером   детальных  ошибок   Int  24h.   Вместо  этого  ДОС

 устанавливает флаг CF и засылает в AX код ошибки:

 

      AL = код ошибки ДОС (0-0Ch); список кодов приведен в 6.4.

      AH = состояние операции  с диском, совпадающее со значением

 AH, которое возвращает Int 13h, подфн 2/3, а именно:

 

 00h = нет ошибки

 02h = не найден адресный маркер

 03h = попытка записи на диск, защищенный от записи

 04h = сектор не найден

 05h = неудачный сброс диска (жесткий диск)

 06h = активна линия смена дискеты (НГМД)

 07h = сбой активности параметра диска (жесткий диск)

 0Ah = обнаружен флаг дефектного сектора (жесткий диск)

 0Bh = найден дефектный цилиндр (жесткий диск)

 0Ch = не найден тип носителя (НГМД)

 0Dh = неверное число сектора при форматировании (жесткий диск)

 0Eh = найден адресный маркер управляющих данных (жесткий диск)

 10h = ошибка CRC индексных ECC

 11h = устранимая ошибка данных (восстановлено методом ЕСС)

       (жесткий диск)

 20h = сбой контроллера

 40h = ошибка поиска 

 80h = таймаут (нет ответа диска)

 AAh = дисковод не готов к работе (жесткий диск)

 BBh = неопределенная ошибка (жесткий диск)

 CCh = ошибка записи (жесткий диск)

 E0h = ошибка статуса (жесткий диск)

 

      Примечания:

 

      1.  Int  25h/26h  могут  обмениваться  с любыми логическими

 дисками ДОС,  в том числе с  фантомным дисководом B, виртуальным

 диском  или логическим  диском, созданным  командами ASSIGN  или

 SUBST. Вместе с тем эти  прерывания не имеют доступа к секторам,

 лежащим  вне  раздела  ДОС.  В  частности,  им недоступен сектор

 головного загрузчика.

 

      2.  Эти  прерывания  оставляют  одно  лишнее  слово в стеке

 (флаги  перед вызовом  прерывания), которые  нужно вытолкнуть из

 стека. Например:

 

      mov  al, 0      ; диск А

      mov  dx, 0      ; сектор 0 = загрузочный сектор

      mov  cx, 1      ; читаем 1 сектор...

      lea  bx, buffer ; в буфер DS:BX

      int  25h

      pop  dx         ; вытолкнуть слово из стека

      jc   error      ; на обработку ошибки

       . . .

 

      3.  Вы  не  должны  полагать,  что  длина сектора равна 512

 байтам. Для определения длины  сектора можно использовать фн 1Ch

 или 32h.

 

      4. Помните,  что запись сектора в  FAT или корневой каталог

 может разрушить файловую структуру диска.

 

      См. также: Таблица размещения файлов

                 Таблица разделов жесткого диска.

 

Вы находитесь в разделе: 

Добавить коментарий