Страница 3 из 41
Средний уровень. Функция 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:
|