Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
METODIchka4.DOC
Скачиваний:
5
Добавлен:
04.05.2019
Размер:
940.03 Кб
Скачать

Пример выполнения работы

Написать программу, выводящую в буфер список занимаемых файлом LAB9.TXT кластеров. Для каждо­го кластера выводить соответствующие ему номера стороны, дорожки и сектора. Используется дискета на 360К, корневой каталог).

*Примечания :

см. Приложение В

data segment

params dw 1000 dup(7 dup("P")) ; буфер вывода

FAT db 1024 dup("F") ; буфер для FAT

CAT db 512*7 dup ("С") ; буфер для ката­лога

f_name db "LAB9 TXT" ; имя файла

mess db "Дискета не 350К !",10,13,'$'

sect1 dw 4

sect2 dw 5

head1 dw 1

head2 dw 1

track1 dw 0

track2 dw 0

clust dw 0

data ends

code segment

assume cs:code, ds:data

; Подпрограммы;

; Чтение сектора

;получает : АН - номер функции (2)

; СН - номер дорожки

; CL - номер сектора

; AL - количество секторов

; DH - номер стороны DL - дисковод

; ES:BX - смещение буфера .

; возвращает : AL - код ошибки :

read_sect proc near

push сx

push dx

push di

xor di,di

r_2: push ax

int 13h

jnc r_l ; если нет ошибки - выход

cmp di,2 ; если

je r_l ; ошибка,

mov ah,0 ; сброс дисковой подсистемы

int 13h ; и

pop ax ; повторить еще раз

inc di ; ( не более трех раз )

jmp r_2

r_l: pop di

pop di

pop dx

pop сx

ret

read_sect endp

; Сравнение строк

; получает : DS:DI - адрес имени файла возвращает : АХ - или 0 (имя совпадает с

; f_name), или FF

f_find proc near

push сx

push si

mov ax,0ffh

lea si,f_name ; сравнивает строку DS:DI со

mov сx, 11 ; строкой из f_name

repe cmpsb

jne f_qui

xor ax, ax

f_qui:

pop si

pop сx

ret

f_find endp

; Номер следующего кластера

; - получает : AX - номер кластера

; - возвращает : АХ - номер следующего кластера

next_clust proc near

push bx

push сx

push dx

mov bx.nx ; домножить номер кластера

mov dx.ax ; но

sh1 bx,1 ; 3/2, считать результат

add bx,ax ; смещением и извлечь

shr bx,l ; слово по этому смещению

mov ax,word ptr FAT[bx] ; в FAT

test dx,l ;предыдущий кластер четный?

jz is_even ; да - на метку is_even нечетный кластер

mov с1,4 ; выделить старшие 12 бит

shr ах,с1 ;

jmp short done

is_even:

; четный кластер

and ax,0fffh ; выделить младшие 12 бит done:

pop dx

pop сx

pop bx

ret

next_clust endp ; Физические параметры

; - получает : АХ - номер кластера

; - возвращает : физические параметры секторов, составляющих кластер в

; переменных headl, trackl, sect1, head2, track2, sect2

phys_params proc near

push bx

mov sect1,4 ; первый сектор с данными

mov trackl,0 ; первая дорожка с данными

mov head1,1 ; первая сторона с данными

mov dust, 2 ; первый кластер с данными

pp2: cmp clust,ax

jge pp1

inc clust

xor bx,bx

pp5: cmp bx,2 ; секторов в кластере

jge pp2

inc bx

cmp sectl,9 ; секторов на дорожке

jne pp3

mov sect 1,1

cmp head1,0

jne pp4

mov head 1,1

jmp short pp5

pp4: mov headl,0

inc track1

jmp short pp5

pp3: inc sect1

jmp short pp5

pp1: mov bx,headl

mov head2.bx

mov bx,track 1

mov track2,bx

mov bx,sect1

mov sect2,bx

cmp sect1,9

je pp6

inc sect2

jmp short pp7

pp6: mov sect2,1

cmp headl,0

jne pp8

mov head2,l

jmp short pp7

pp8: mov head2,0

inc track2

pp7: pop bx

ret

phys_params endp

; Вывод физ. характеристик

; Выводит в params физ. параметры для секторов

; кластера

out_sec proc near

push ax

mov ax,dust

mov [bx],ax

mov ax,headl

mov [bx+2],ax

mov ax, track 1

mov [bx+4],ax

mov ax, sect1

mov [bx+6],ax

mov ax,head2

mov [bx+8],ax

mov ax, track2

mov [bx+10],ax

mov ax,sect2

mov [bx+12],ax

pop ax

ret

out_sec endp

; Программа

start: mov ax,data

mov ds,ax

mov es,ax

; загрузить FAT

lea bx,FAT

mov ax,0202h ; АН->номер ф-и, AL->к-во секторов

mov cx,2 ; СН->дорожка, СL->сектор

mov dx,0 ; DН->сторона, DL->дисковод

call read_sect

call disk_status

; проверить байт-описатель ( для 360К - должен быть FD )

cmp byte ptr [bx],0fdh

je s4

jmp quit1

s4:

; загрузить каталог

lea bx,CAT

mov ax,0207h ; AH- >номер функции, ;AL-> к-во секторов

mov cx,6 ; СH- дорожка, СL->сектор

mov dx,0 ; DH- сторона, DL->дисковод

call read_sect

call disk_status

; выводим информацию по файлу f_name

s2: cmp word ptr [bx+26],0 ; по смещению 26

jne s5 ;первый кластер файла

jmp quit

s5: mov di.bx

call f_find

cmp ax,0

je s1

add bx,32 ; на следующую запись

jmp s2 ;в каталоге

s1:

; первый кластер файла

mov ax,[bx+26]

lea bx,params ; смещение буфера ; результатов

; список кластеров файла

s3: cmp ax,0fffh

je quit

mov clust,ax

call phys_params

call out_sec

add bx,14 ; смещение в списке ;параметров

call next_clust ; для следующего кластера

jmp s3

quit1: lea dx,mess

mov ah, 9

int 21h

quit: mov ax,4c00h

int 21h

code ends

end start

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]