- •Обработка прерываний
- •Обработка прерывания
- •Изменение вектора прерывания
- •Функция 35h
- •Дополнительные сведения о структуре doSиBios Прямое обращение к видеопамяти
- •Буфер клавиатуры
- •Пример выполнения работы
- •Варианты заданий
- •Вопросы по теме
- •Лабораторная работа № 2.
- •Функция 0ен
- •Функция 3dн Открывает хендл (открывает файл) на диске
- •Функция 3ен
- •Функция 3fh
- •Функция 40н
- •Функция 41н
- •Функция 42н
- •Функция 43h
- •Функция 47н
- •Функция 4ен
- •Функция 4fh
- •Функция 56н
- •Функция 57н
- •Функция 5ан
- •Прерывание 25н
- •Прерывание 26н
- •Пример выполнения работы Создать новую директорию new_dir на диске а:, сделать ее текущей, записать туда файл newfile.Txt и в него записать сообщение - "Это вновь созданный файл".
- •Порядок выполнения работы
- •Вопросы по теме работы
- •Лабораторная работа № 3
- •Основные сведения
- •Функция Назначение
- •Функция 00н
- •Функция 01h
- •Функция 02h
- •Функция 03h
- •Пример выполнение работы
- •Контрольные вопросы
- •Лабораторная работа № 4 Таймер и генерация звука.
- •Форматы управляющих команд таймера.
- •Использование каналов в ibm pc.
- •Генерация звука.
- •Частоты нот для второй октавы
- •Варианты заданий.
- •Вопросы по теме работы.
Функция 5ан
Создает временный файл на диске
*Вход:
АН = 5АН
СХ - атрибут файла
DS:DX - указатель на маршрут
*Выход:
Флаг переноса установлен:
АХ = 2 - файл не найден
= 3 - маршрут не найден
= 4 - слишком много открытых файлов
= 5 - нет доступа
Флаг переноса сброшен:
АХ - хендл
*Примечание.
Функция 5Ah создает файл с уникальным именем. DX должен содержать смещение строки, указывающей маршрут. Маршрут представляет собой строковую переменную, задающую маршрут и имя файла и, кроме завершающего нуля, содержит еще 13 байт для записи имени файла, например,
path_l db "a:\userl",0 ,13 dup(0)
Временный файл не уничтожается автоматически, это можно сделать функцией 41h.
Прерывание 25н
Читает диск по секторам
*Вход:
AL - номер дисковода ( 0-А, 1-В и т.д.)
DS:BX - адрес буфера диска
СХ - количество секторов
DX - начальный относительный сектор
*Выход:
Флаг переноса установлен:
AL - код ошибки
Флаг переноса сброшен: нет ошибок
*Примечание.
Прерывание 25h читает с диска в буфер обмена количество секторов, указанных в DX. При вызове прерывания разрушаются все регистры кроме сегментных, поэтому необходимо сохранять перед вызовом все регистры. В момент прерывания система помещает регистр флагов в стек, а при возвращении не выбирает его, поэтому не забывайте очищать стек после прерывания.
Прерывание 26н
Записывает диск по секторам
*Вход:
AL - номер дисковода ( 0-А, 1-В и т.д.)
DS:BX - адрес буфера диска
СХ - количество секторов
DX - начальный относительный сектор
*Выход:
Флаг переноса установлен:
AL - код ошибки
Флаг переноса сброшен: нет ошибок
*Примечание.
Прерывание 26h пишет на диск буфер обмена количество секторов, указанных в DX. При вызове прерывания разрушаются все регистры, кроме сегментных, поэтому необходимо сохранять перед вызовом все регистры. В момент прерывания система помещает регистр флагов в стек, а при возвращении не выбирает его, поэтому не забывайте очищать стек после прерывания.
Пример выполнения работы Создать новую директорию new_dir на диске а:, сделать ее текущей, записать туда файл newfile.Txt и в него записать сообщение - "Это вновь созданный файл".
date segment
path_l db "new_dir",0
path_2 db 'newfile.txt',0
hendle dw 0
mes db 'Это вновь созданный файл', 10,13
date ends
code segment
assume cs:code,ds:date
start: mov ax, date
mov ds,ax
mov dl,0 ; текущий диск - A:
mov ah,OEh ; загрузка функции ОЕ
int 21h ; смена текущего диска
mov dx, offset path_l ; загрузка маршрута нового каталога
mov ah,39h ; загрузка 39-й функции
int 21h ; создание нового каталога
jc m1 ; переход, если есть ошибка
mov dx,offset path_l ; маршрут нового каталога
mov ah,3bh ; загрузка функции 3b
int 21h ; смена каталога
jc ml ; переход, если нет ошибки
mov dx, off set path_2 ; загрузка маршрута нового каталога
mov сх,0 ; установка атрибута чтение/запись
mov ah,3Ch ; загрузка функции ЗС
int 21h ; создание файла
jc ml ; переход, если есть ошибка
mov hendle,ах ; сохранить хендл
mov bx,hendle ; установить хендл
mov сх,26 ; количество символов для записи
mov dx,offset mes ; начало записываемого текста
mov ah,40h ; загрузка 40-й функции
int 21h ; записать в файл сообщение
jc ml ; переход, если есть ошибка
сmр ах,2б
jz m3
mov ах,13 ;код ошибки при неправильной передаче
jmp ml ; переход при несовпадении
mЗ: mov bx,hendle ; загрузить хендл
mov ah,3Eh ; загрузка функции ЗЕ
int 21h ; закрыть хендл
jc ml ; переход, если есть ошибка
jmp m2
m1: call er_disk ; переход на конец
m2: mov ax,4c00h ; выход
int 21h
er_disk proc near ; выдача сообщений об ошибках
push ds ; сохранить сегмент данных
mov cx,cs ; изменить
mov ds,cx ; сегмент данных
сmр ах,2 ; ошибка 2 ?
jnz @3 ; нет, продолжить анализ
mov dx,offset message2 ; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@3: сmр ах,3 ; ошибка 2 ?
jnz @4 ; нет, продолжить анализ
mov dx,off set message3 ; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@4: сmр ах,4 ; ошибка 4 ?
jnz @5 ; нет, продолжить анализ
mov dx, offset message4 ; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@5: сmр ах,5 ; ошибка 5 ?
jnz @6 ; нет, продолжить анализ
mov dx,offset message5 ; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@6: сmр ах,б ; ошибка 6 ?
jnz @12 ; нет, продолжить анализ
mov dx,offset message6 ; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@12: сmр ах,12 ; ошибка 12 ?
jnz @13 ; нет, продолжить анализ
mov dx,offset messagel2 ;загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@13: сmр ах,13 ; ошибка 12 ?
jnz @14 ; нет, продолжить анализ
mov dx,offset messagel3; загрузка буфера сообщения
jmp @15 ; переход на вывод сообщения
@14: mov dx,offset messagel4; ошибка не распознана
@15: mov ah,9 ; загрузка 9-й функции
int 21h ; вывод сообщения об ошибке
mov dx,offset wait_
mov ah,9 ; загрузка 9-й функции
int 21h ; вывод сообщения
mov ah,8 ; загрузка 8-й функции
int 21h ; ожидание pop ds
ret ; выход из процедуры
message2 db 10,13,'Файл не найден',10,13,'$'
message3 db 'Маршрут не найден',10,13,'$'
message4 db 'Слишком много открытых фалов',10,13,'$'
message5 db 10,13,'Нет доступа',10.13,'$'
message6 db 'Несуществующий хендл',10,13,'$'
message12 db 'He разрешен доступ',10,13,'$'
message13 db 'Неверная передача данных в файл',10,13,'$'
message14 db 'Неопределенная ошибка',10,13,'$'
wait_ db 'Нажмите любую клавишу',10,13,'$'
er_disk endp
code ends
end start
