- •Лабораторная работа № 1.
- •Функция 0ен
- •Функция 1ан
- •Функция 2fh
- •Функция 36н Определяет параметры диска
- •Функция 39н
- •Функция 3ан Удаляет каталог с диска
- •Функция 3вн Меняет текущий каталог на заданный
- •Функция 3сн Создаёт хендл (новый файл) на диске
- •Функция 3dн Открывает хендл (открывает файл) на диске
- •Функция 3ен
- •Функция 3fh
- •Функция 40н
- •Функция 41н
- •Функция 42н
- •Функция 43h
- •Функция 47н
- •Функция 4ен
- •Функция 4fh
- •Функция 56н
- •Функция 57н
- •Функция 5ан
- •Прерывание 25н
- •Прерывание 26н
- •Пример выполнения работы Создать новую директорию new_dir на диске а:, сделать ее текущей, записать туда файл newfile.Txt и в него записать сообщение - "Это вновь созданный файл".
- •Порядок выполнения работы
- •Вопросы по теме работы
- •Лабораторная работа № 2
- •Функция 00н
- •Функция 01н
- •Функция 02н
- •Функция 03н
- •Функция 04н
- •Флаг переноса установлен
- •Функция 05н
- •Пример выполнения работы
- •Порядок выполнения работы
- •Варианты заданий. Не использовать функции dos !!!.
- •Вопросы по теме работы.
- •Приложение а. Функция disk_status
- •Приложение в. Параметры 360к дискеты.
- •Лабораторная работа № 3
- •Основные сведения
- •Функция Назначение
- •Функция 00н
- •Функция 01h
- •Функция 02h
- •Функция 03h
- •Пример выполнение работы
- •Контрольные вопросы
- •Лабораторная работа № 4
- •Основные сведения
- •Функция 00h
- •Функция 01h
- •Функция 02h
- •Система команд матричного принтера
- •Система команд принтера фирмы Epson.
- •Команды форматирования текста
- •Команды печати графических изображений.
- •Пример выполнения работы.
- •Порядок выполнения работы
- •Варианты заданий.
- •Контрольные вопросы
- •Лабораторная работа № 5 Таймер и генерация звука.
- •Форматы управляющих команд таймера.
- •Использование каналов в ibm pc.
- •Генерация звука.
- •Частоты нот для второй октавы
- •Варианты заданий.
- •Вопросы по теме работы.
- •Лабораторная работа № 6 Работа с драйвером мыши.
- •Обращение к драйверу мыши из ассемблера
- •Функции драйвера мыши.
- •Функция 00h
- •Показать курсор
- •Функция 06н
- •Функция 07h
- •Функция 08h
- •Функция 09h
- •Функция 0Ah
- •Функция 0Bh
- •Функция 0Сh
- •Функция 0Dh
- •Функция 0Eh
- •Функция 0Fh
- •Функция 10h
- •Функция 13h
- •Функция 15h
- •Функция 16h
- •Функция 17h
- •Функция 18h
- •Программирование с использованием драйвера мыши.
- •Пример выполнения работы.
Пример выполнения работы
Написать программу, выводящую в буфер список занимаемых файлом 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