Прерывания INT 25h и INT 26h
Для работы с логическим диском (или дискетой) на уровне логических номеров секторов MS-DOS предоставляет программам два прерывания - INT25h (чтение сектора по его логическому номеру) и INT 26h (запись сектора по его логическому номеру). Вызов этих прерываний имеет различный формат для разных версий MS-DOS. Для тех версий, которые не поддерживают размер логических дисков более 32 Мбайт (MS-DOS 3.10, 3.20, 3.30) используется следующий формат:
На входе: | AL | Адрес НГМД или НМД (0 - A:, 1 - B:, ...) |
CX | Количество секторов, которые нужно прочитать | |
DX | Логический номер начального сектора | |
DS:BX | Адрес буфера для чтения | |
На выходе: | AH | Код ошибки при неуспешном завершении операции |
CF | 1, если произошла ошибка, 0, если ошибки нет |
На входе: | AL | Адрес НГМД или НМД (0 - A:, 1 - B:, ...) |
CX | Количество секторов, которые нужно записать | |
DX | Логический номер начального сектора | |
DS:BX | Адрес буфера, содержащего данные | |
На выходе: | AH | Код ошибки при неуспешном завершении операции |
CF | 1, если произошла ошибка, 0, если ошибки нет |
Для более поздних версий MS-DOS и для COMPAQ DOS версии 3.31 используется другой способ указания номера логического сектора.
Так как шестнадцати разрядов недостаточно для адресации диска размером более 32 Мбайт, то при работе с расширенным разделом диска, занимающим более 32 Мбайт, регистры используются по-другому.
Регистр CX содержит FFFFh - признак того, что программа работает с логическим диском, имеющим размер более 32 Мбайт.
Регистры DS:BX содержат адрес следующей структуры:
Смещение | Размер | Содержимое |
0 | 4 | Начальный номер логического сектора |
4 | 2 | Количество секторов для чтения или записи |
6 | 4 | Дальний адрес буфера для передачи данных |
Так как для указания начального номера логического сектора в этом управляющем блоке отводится 4 байта, то снимается указанное ранее ограничение на размер логического диска.
Сделаем очень важное замечание, касающееся только что рассмотренных прерываний MS-DOS.
Эти прерывания оставляют в стеке одно слово - старое значение регистра флагов. Поэтому после вызова прерывания должна следовать, например, такая команда:
pop ax
Содержимое загрузочного сектора может быть использовано для определения общего количества секторов на логическом диске, для работы с таблицей размещения файлов FAT , о которой мы будем говорить ниже, для определения других характеристик логического диска.