Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители
Страница 3. Чтение таблицы размещения файлов. Часть 2


   Средний уровень.


   Функция  DOS 1CH дает информацию о таблице размещения  файлов,
но не дает саму FAT.  Поместите  номер  накопителя  в DL, где 0 =
накопитель  по умолчанию, 1 = A, и т.д.  При возврате DX содержит
число кластеров в FAT, а CX - число  байтов в секторе. DS:BX ука-
зывает  на байт, содержащий первый байт FAT, т.е.  на код, указы-
вающий тип диска; эти коды перечислены в [1.1.5].

   Низкий уровень.


   Намного легче получить доступ к FAT в языке ассемблера.  Отме-
тим, что умножение номера кластера  на 1.5 производится копирова-
нием  числа, сдвигом копии вправо на 1 бит для деления пополам  и
сложением копии с оригиналом.  Этот метод автоматически окгруляет
результат вниз. Код, считывающий сектора FAT в память, обсуждает-
ся в [5.4.2].

;---в сегменте данных
BUFFER    DB   1024  DUP(0)  ;отводим место для 2 секторов

;---читаем FAT в память
          LEA  BX,BUFFER      ;указываем на буфер данных
          MOV  DX,1           ;логический номер сектора
          MOV  CX,2           ;2 сектора
          MOV  AL,0           ;накопитель A
          INT  25H            ;читаем сектора
          POP  CX             ;восстанавливаем стек
;---получаем номер кластера
          MOV  AX,3           ;номер кластера в AX
          MOV  CX,AX          ;делаем копию
          MOV  DX,AX          ;делаем вторую копию
          SHR  DX,1           ;делим вторую копию на 2
          ADD  CX,DX          ;складываем между собой
          ADD  BX,CX          ;добавляем как смещение
          MOV  DX,[BX]        ;получаем 2 байта из этого места
          TEST AX,1           ;номер кластера нечетный?
          JNZ  ODD_CLUSTER    ;уход, если да
          AND  DX,0000111111111111B    ;получаем номер
          JMP  SHORT CONTINUE   ;уход через обработку нечетного
ODD_CLUSTER:   MOV  CL,4      ;подготовка к сдвигу вправо
          SHR  DX,CL          ;сдвигаем вниз старшие 12 битов
CONTINUE:

 
« Предыдущая статья   Следующая статья »