CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
Функции DOS - INT 25H/26H: Прямая дисковая операция чтения/записи
Вход
- AL = номер диска (0=A, 1=B, и т.д.)
- CX = счетчик считываемых или записываемых секторов
- DX = начальный сектор (логический номер сектора DOS)
- DS:BX = адрес данных (исходный или целевой буфер)
Выход
- Выход
- AX = код ошибки, если взведен флаг переноса (CF=1) (см. ниже)
- значения всех регистров портятся, за исключением DS,ES,SS,SP ВАЖНО: эти функции оставляют одно лишнее слово в стеке
Этот сервис DOS предоставляет прямой доступ к любому сектору диска, доступному через DOS-BIOS или устанавливаемые драйверы устройств.
- INT 25H читает секторы
- INT 26H записывает секторы
Логические секторы DOS начинаются с корневого сектора . первый сектор в разделе DOS - это логический сектор 0. номера логических секторов возрастают сначала для каждого сектора на цилиндре, затем по каждой головке, и наконец по каждому цилиндру на устройстве.
Заметьте, что Главная корневая запись и любые другие секторы вне раздела DOS недоступны через этот сервис. прерывание INT 13H - это единственный сервис, который предоставляет полный доступ к любой части твердого диска.
Ошибки
Ошибки, возникающие в процессе INT 25H/26H, НЕ обрабатываются обработчиком кртических ошибок INT 24H . при выходе из INT 25H/26H, DOS-BIOS взводит флаг переноса (CF=1), когда встречается ошибка. Если установлен флаг CF:
- AL = ошибка устройства (0-0cH) - аналогично битам 0-7 в DI для INT 24H - это
- AL = один из кодов ошибок 13H-1fH (без 13H) в списке кодов ошибок DOS
- AH = 80H = attachment failed to respond
- AH = 40H = ошибка операции поиска на диске
- AH = 08H = неверная контрольная сумма (CRC) при чтении дискеты
- AH = 04H = запрошенный сектор не найден
- AH = 03H = попытка записи на защищенную от записи дискету
- AH = 02H = ошибка, отличная от перечисленных выше
Пример
Участок программы, читающий корневой сектор дискеты:
mov al,0 ;выбрать диск A mov dx,0 ;выбрать корневой сектор DOS и BPB mov cx,1 ;читать один сектор ... lea bx,my_buf ; ... в буфер по адресу DS:BX int 25H pop dx ;удалить лишнее слово из стека jnc no_err ...и т.д. ;обработать любую ошибку диска (код в AX) no_err: ...и т.д. ;продолжить (ошибок нет)
Замечание:
Не следует предполагать, что сектор содержит ровно 512 байт. Используйте функции 1cH или 32H либо прочитайте корневой сектор , чтобы определить истинный размер секторов.
32 мегабайта?
Утверждается, что DOS поддерживает максимальный объем диска в 32 Мб, но, строго говоря, это неправда. для стандартных драйверов устройств размер сектора равен 512K. Очвидно, что, поскольку наибольший номер сектора, который можно поместить в DX для INT 25H/26H, равен 65535, максимальный размер диска получается равным 32767K, или 32M.
Однако не-IBM'овские драйверы (или будущие драйверы IBM) могут поддерживать размер сектора, больший 512 байт. Поэтому для размера диска нет практических ограничений. Даже для сегодняшних драйверов, 32-мегабайтный максимум относится лишь к единственному разделу DOS.