Исследование таблицы размещения файлов (FAT-таблицы) ОС MS-DOS, страница 2

ROOT_OFFSET dw 0       ; первый сектор root

SECTORSIZE dw 512      ; размер сектора

CLUSTERSTRING db 'Number: $'

NUMCLUSTER dw 0

OSET dw 0

CURRENT_SECTOR dw 0 ; текущий сектор отн начала FAT

OFFSET_IN_SECTOR dw 0 ; смещение байта в секторе

FIRST_BYTE db 0

SECOND_BYTE db 0

ODD dw 0

data ends

stk segment  stack

db 256 dup(0)

stk ends

code segment  para public 'code'

main proc

assume cs:code,ds:data,ss:stk,es:data

mov ax,data

mov ds,ax

mov es,ax

cld

mov ah,9

mov dx,offset MESSAGE

int 21h

mov ah,01h

int 21h

sub al,30h

mov DISK,al ; номер диска

mov bx,offset BUFFER

mov cx,1

mov dx,0

int 25h

mov cx,5

mov si,offset BUFFER+54

lea di,FAT16

repe cmpsb

jne FAT12

mov TYPEFAT,1

FAT12: outstring NL,FILESYSTEM,BUFFER+54,8

mov si,offset BUFFER+11

lea di,SECTORSIZE

movsw

outnumber NL,BYTEPERSECTOR,SECTORSIZE,STRING,2

lea di,RESSECT

mov si,offset BUFFER+14

movsw

outnumber NL,RESERVEDSECTORS,RESSECT,STRING,2

lea di,FAT_SIZE

mov si,offset BUFFER+22

movsw

outnumber NL,SECTORPERFAT,FAT_SIZE,STRING,2

lea di,FAT_CNT

mov si,offset BUFFER+16

movsb

outnumber NL,FATCOUNT,FAT_CNT,STRING,1

lea di,DESC_CNT

mov si,offset BUFFER+17

movsw

outnumber NL,MAXDESCCOUNT,DESC_CNT,STRING,2 

mov ax,RESSECT

;add ax,1

mov FAT_OFFSET,ax

xor ax,ax

mov al,FAT_CNT

mul FAT_SIZE

add ax,FAT_OFFSET

mov ROOT_OFFSET,ax

outnumber NL,ROOTOFFSETSTRING,ROOT_OFFSET,STRING,2

mov ah,9

mov dx,offset MESSAGE_FILE

int 21h

mov al,18

mov FILENAME,al   ; имя файла

lea dx,FILENAME

mov ah,0ah

int 21h

mov di,offset FILENAME+2

mov al,2Eh

xor cx,cx

mov cl,byte ptr FILENAME+1

repne scasb

xor ax,ax

mov al,byte ptr FILENAME+1

sub al,cl      ; длина имени

dec al

mov NAMELEN,al

mov EXTLEN,0

jcxz notfound  ; символ не найден

mov EXTLEN,cl

mov si,offset FILENAME+2

add si,ax

inc si

lea di,EXT

rep movsb

notfound:     

mov cl,NAMELEN

mov si,offset FILENAME+2

lea di,FNAME

rep movsb

;outstring NL,NAMESTRING,FNAME,NAMELEN

outnumber NL,NAMESTRING,NAMELEN,STRING,1

;outstring NL,EXTSTRING,EXT,EXTLEN

outnumber NL,EXTSTRING,EXTLEN,STRING,1

mov bx,offset BUFFER ; первый сектор root

xor ax,ax

mov al,DISK

mov cx,1

mov dx,ROOT_OFFSET

int 25h

mov cx,DESC_CNT

xor ax,ax      ;счётчик слов в секторе

descriptor :

push cx

push ax

mov di,bx

add di,ax

mov OSET,di

mov cx,8

xor ax,ax

mov al,20h

repne scasb

mov ax,8

jcxz cmp_name

sub ax,cx ; длина текущего имени файла

dec ax

cmp_name : cmp al, NAMELEN

jne continue

mov cx,ax

lea si,FNAME

mov di,OSET

repe cmpsb

jne continue

extcomp:       ; сравнение расширений

mov di,OSET

add di,8

mov cx,3

mov ax,0020h

repne scasb

mov ax,3

jcxz cmp_ext

sub ax,cx      ;длина текущего расширения

dec ax

cmp_ext : cmp al,EXTLEN

jne continue

mov cx,ax

lea si,EXT

mov di,OSET

add di,8

repe cmpsb

jcxz filefound

continue:

pop ax

pop cx

add ax,32

cmp ax,SECTORSIZE

jl lp

push cx

xor ax,ax

mov al,DISK

mov cx,1

inc dx

int 25h

pop cx

pop cx

xor ax,ax

lp:     loop descriptor

; файл не найден

outstring NL,NOTFOUNDMESSAGE,BUFFER,0

jmp exit

filefound:

pop ax

pop cx

outstring NL,FOUNDMESSAGE,BUFFER,0

; файл найден

mov si,ax

mov ax,26[bx][si]

mov NUMCLUSTER,ax

mov CURRENT_SECTOR,0FFFFh

cluster: outnumber NL,CLUSTERSTRING,NUMCLUSTER,STRING,2

;add ax,2

xor dx,dx

cmp TYPEFAT,1

je off16

mov cx,3   ; это пропускается для FAT16

mul cx

mov cx,2

div cx

mov ODD,dx ; признак нечётности ячейки(1-нечётная 0-чётная)

xor dx,dx

off16:

mov cx,SECTORSIZE

div cx ; сектор относительно начала FAT

mov OFFSET_IN_SECTOR,dx       ; смещение в секторе

cmp ax,CURRENT_SECTOR

je take_first

mov CURRENT_SECTOR,ax

mov al,DISK

mov cx,1

mov dx,FAT_OFFSET

add dx,CURRENT_SECTOR

int 25h

take_first :

mov si,bx

add si,OFFSET_IN_SECTOR

lea di,FIRST_BYTE

movsb

inc OFFSET_IN_SECTOR

; второй байт

mov ax,SECTORSIZE

cmp ax,OFFSET_IN_SECTOR

jne take_second

inc CURRENT_SECTOR

mov al,DISK

mov cx,1

mov dx,FAT_OFFSET

add dx,CURRENT_SECTOR

int 25h

mov OFFSET_IN_SECTOR,0

take_second :

mov si,bx

add si,OFFSET_IN_SECTOR

lea di,SECOND_BYTE

movsb

mov al,FIRST_BYTE

mov ah,SECOND_BYTE

cmp TYPEFAT,1

je F16

cmp ODD,1   ;нечётная ячейка

jne ev

shr ax,4

jmp F12

ev:     and ax,0FFFh

F12:    cmp ax,0FF8h

jge exit

jmp newcluster

F16: cmp ax,0FFF8h

jge exit

newcluster :

mov NUMCLUSTER,ax

jmp cluster 

exit:

mov ax,4c00h

int 21h

main endp

code ends

end main