Прерывания, используемые при работе с файлами на дисках

Прерывания BIOS:

l 13Н — обмен данными с жестким диском (при его отсутствии — с гибким диском);

l 40Н — обмен данными с гибким диском (если есть жесткий диск).

Эти прерывания обеспечивают выполнение многих функций, определяемых содержимым регистра AH, и полезных при разработке вспомогательных программ и средств защиты от копирования, поскольку они позволяют выполнять операции с отдельными дорожками и секторами диска.

l Прерывание DOS 21H.

Имеется несколько десятков различных вариантов прерывания 21Н (определяемых содержимым регистра AH), реализующих так называемые универсальные функции управления файлами при наличии любых версий MS DOS (использующих при обращении к файлам FСB) и несколько десятков вариантов прерывания, предоставляющих так называемые расширенные функции управления файлами при наличии версии MS DOS 2.0 и выше (через строку ASCIIZ).

Ниже обсуждаются лишь наиболее популярные варианты прерывания 21H DOS, реализующие расширенные функции управления файлами.

При прерываниях этого типа файл полностью идентифицируется ASCIIZ-строкой, а после открытия файла — логическим номером, присваиваемым файлу при его создании и открытии (после закрытия файла его логический номер освобождается).

Вот сводка некоторых служебных функций DOS прерывания 21Н.

l AH = 3Ch — создание файла: формируются ASCIIZ-строка, идентифицирующая файл, и атрибут файла; вектор-адрес ASCIIZ-строки файла помещают в регистры DS:DX, в регистр CX помещают атрибут файла; в регистре AX возвращается логический номер файла.

l AH = 3Dh — открытие файла: вектор-адрес ASCIIZ-строки помещают в регистры DS:DX, в регистр AL записывается признак возможной работы с файлом (AL = 0 — файл открывается только для чтения, AL = 1 — только для записи, AL = 2 — и для чтения, и для записи); в регистре AX возвращается логический номер файла.

l AH = 3Eh — закрытие файла (высвобождение его логического номера): логический номер помещают в регистр ВX.

l AH = 3Fh — чтение из файла: в регистр BX помещают логический номер, в CX — число считываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), отведенного для записи считываемой информации; число фактически считанных байтов возвращается в регистре AX.

l AH = 40h — запись в файл: в регистр BX помещают логический номер, в CX — число записываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), хранящего записываемую информацию; в AX возвращается число фактически записанных байтов.

l AH = 41h — удаление файла: в регистры DS:DX заносится вектор-адрес ASCIIZ-строки файла.

l AH = 42h — установка указателя текущей записи в файле: в регистр BX заносится логический номер, в регистр AL — указание на базовую установку указателя текущей записи (AL = 0 — начало файла, AL = 1 — прежнее значение текущей записи, AL = 2 — конец файла), в регистры CX:DX — смещение указателя относительно базовой позиции (чаще всего 0); в регистрах DX:AX возвращается смещение текущей записи файла относительно начала файла.

l AH = 43h — установка новых атрибутов файла: в регистры DS:DX заносится адрес ASCIIZ-строки файла, в CX — значения атрибутов, в AL находится «1» (если в AL — «0», то происходит чтение атрибутов, которые возвращаются в CX).

l AH = 56h — переименование файла: в регистровой паре DS:DX указывается адрес ASCIIZ-строки со старым именем файла, в регистры ES:DI заносится адрес ASCIIZ-строки с новым именем файла.

Во всех перечисленных случаях при появлении ошибки в выполнении процедуры в регистре FL флаг CF устанавливается в «1»; код ошибки возвращается в регистре AX.

Ниже приводятся фрагменты программ работы с файлами по ASCIIZ-строке:

path db C:filename.ext, 0 ; ASCIIZ-строка

buf db 1000 dup(?) ; буфер обмена

handle dw ? ; логический номер

size dw ? ; размер файла

l Чтение из файла:

; Открытие файла

mov DX, offset path ; адрес ASCIIZ-строки в DX

mov AL, 0 ; открываем только для чтения

mov AH, 3DH ; функция открытия файла

int 21H ; выполнение прерывания

jc open_error ; если CF=1, обработка ошибки открытия файла

mov handle, AX ; запись логического номера

l Определение размера файла:

mov AH, 42H ; установка указателя текущей позиции

mov AL, 2 ; код установки в конец файла

mov BX, handle ; запись логического номера

mov CX, 0 ; смещение = 0

mov DX, 0 ; смещение = 0

int 21H ; выполнение прерывания

jc point_error1 ; если CF=1, обработка ошибки установки указателя

mov size, AX ; запись размера файла

l Установка указателя в начало файла:

mov AH, 42H ; установка указателя текущей позиции

mov AL, 0 ; код установки в начало файла

mov CX, 0 ; смещение = 0

mov DX, 0 ; смещение = 0

int 21H ; выполнение прерывания

jc point_error2 ; если CF=1, обработка ошибки установки указателя

l Чтение файла:

mov AH, 3FH ; функция чтения из файла

mov BX, handle ; запись логического номера

mov CX, size ; запись размера файла

mov DX, offset buf ; запись адреса буфера обмена

int 21H ; выполнение прерывания

jc read_error ; если CF=1, обработка ошибки чтения из файла

l Закрытие файла:

mov BX, handle ; запись логического номера

mov AH, 3EH ; функция закрытия файла

int 21H ; выполнение прерывания

jc close_erro r ; если CF=1, обработка ошибки закрытия файла

Запись в файл:

l Полная перезапись файла.

; Открытие (создание) файла

mov DX, offset path

mov CX, 0

mov AH, 3CH

int 21H

jc open_error

mov han, AX

; Запись в файл 500 байтов

mov AH, 40H

mov BX, handle

mov CX, 500

mov DX, offset buf

int 21H

jc write_error

l Добавление записей в файл.

; Открытие файла

mov DX, offset path

mov AL, 1

mov AH, 3DH

int 21H

jc open_error

mov handle, AX

; Перемещение указателя в конец файла

mov BX, AX

mov CX, 0

mov DX, 0

mov AL, 2

mov AH, 42H

int 21H

jc point_error

; Запись в файл 300 байтов

mov AH, 40H

mov BX, handle

mov CX, 300

mov DX, offset buf

int 21H

jc write_error

Наши рекомендации