8.4. Чтение и запись с помощью файлового номера

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

nampath  db  ‘A:fn.asm’,0

nampath2 db  ‘c:temptasmfn.dat’,0

такая строка называется ASCIIZ – строкой.

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

Создание файла. Новый файл создается с помощью функции 3Ch прерывания 21h. Регистр dx должен содержать адрес ASCIIZ – строки, содержащей путь и имя файла. В регистре cx должен быть записан атрибут файла. (Атрибут участвует в записи информации о файле в корневом каталоге, см. п. 8.1.) Файловый номер состоит из одного слова. Например:

      mov   ah,3Ch

      mov   cx,0        ;обычный файл

      lea   dx,nampath  ;путь и имя

      int   21h

      jc    error       ;если ошибка

      mov   handle,ax   ;файловый номер

Здесь файловый номер описывается как

handle  dw  ?

В случае возникновения ошибки флаг CF=1.

Запись файла. Файл записывается с помощью функции 40h. В регистре BX должен быть установлен файловый номер, в CX – число записываемых байтов, в DX – адрес области, откуда будут считываться данные, записываемые в файл. Например, если этот буфер называется OUTREC и содержит 256 байт, то для его записи достаточно выполнить команды:

      mov   ah,40h      ;функция записи

      mov   bx,handle   ;файловый номер

      mov   cx,256      ;256 байт

      lea   dx,outrec   ;адрес области вывода

      int   21h

      jc    error2      ;если ошибка

      cmp   ax,256      ;все байты записаны?

      jne   error3

Если диск переполнен, то записываются не все байты. Возникает ошибка.

Закрытие файла. Для закрытия файла файловый номер записывается в BX и вызывается функция 3Eh:

            mov   ah,3Eh

      mov   bx,handle

      int   21h

В случае ошибки в регистре AX возвращается 06 (неправильный файловый номер).

Открытие файла. Существующий файл открывается с помощью функции 3Dh прерывания 21h. При этом регистр DX должен содержать ASCIIZ – строку с путем доступа и именем файла, а регистр AL – код доступа:

0 – открыть на чтение

1 – открыть на запись

2 – открыть на чтение и запись.

В регистре AX возвращается файловый номер. Например:

      mov   ah,3Dh

      mov   al,0        ;только чтение

      lea   dx,nampath

      int   21h

      jc    error       ;если ошибка

      mov   handle,ax   ;файловый номер

Чтение файла. Открытый на чтение файл читается с помощью функции DOS 3Fh. При этом необходимо установить в регистре BX файловый номер, в CX – число байтов и в DX – адрес области ввода. Например, в случае определения данных

handle  dw  ?

buffer  db  512 dup(‘ ‘)

и файла, открытого выше, для чтения данных достаточно выполнить команды:

      mov   ah,3Fh      ;функция чтения

      mov   bx,handle   ;файловый номер

      mov   cx,512      ;длина записи

      lea   dx,buffer   ;буфер для чтения

      int   21h

      jc    error       ;если ошибка

      cmp   ax,0        ;в ax — число

      je    endfile     ;прочитанных байтов