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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.