Ассемблер Это просто! Учимся программировать


Немного теории


Пришло время рассмотреть работу с файлами.

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

Функция 3Dh прерывания 21h - открытие файла:

Вход: AH = 3Dh

AL = тип открытия (00 - только чтение, 01 - только запись, 02 - чтение / запись)

DS:DX = адрес ASCII-строки с именем файла

Выход:

AX - номер файла

JC - ошибка

Итак, на входе AL должен содержать тип открытия (что мы будем делать с файлом: только прочитаем в память, только запишем что-нибудь или будем делать и то и другое). Естественно, при открытии файла для чтения / записи (AL=3) мы не обязаны прочитать его, а затем что-то записать. Можно просто записать, можно просто прочитать, а можно вообще ничего не делать.

Однако, следует иметь в виду, что если мы попытаемся открыть файл с атрибутом "Только чтение" ("read-only") для записи (AL=2) или для чтения / записи (AL=3), то функция вернет ошибку.

Следующий код открывает файл для чтения / записи: ... mov ax,3D02h mov dx,offset File_name int 21h ... File_name db 'command.com',0

Обратите внимание, что мы в AX загружаем сразу два числа: 3Dh и 02h. Это будет работать быстрее, если бы мы делали так:

mov ah,3Dh mov al,02h

Строку

File_name db ....

можно помещать где угодно. Главное, чтобы она не перемешивалась с кодом. Я это уже объяснял, но, тем не менее, ко мне приходят вопросы по этому поводу. Например, нельзя делать так: ... mov ax,3D02h mov dx,offset File_name File_name db 'command.com',0 int 21h ...

В данном случае, программа сассемблируется без ошибок, но зависнет при запуске. Процессор распознает 'command.com' как набор инструкций, а не строку символов. Скорее всего, это не имеет никакой логики...

Имя файла можно указывать даже так:

File_name db 'C:\ASSM\command.com',0

ПРОПИСНЫЕ и строчные символы значения не имеют. Можно записать и так:

My_file db 'a:\myfile.doc',0

Если диск и путь к файлу опущен, то программа будет искать файл в текущем каталоге

Теперь о том, что возвращает функция. Вот код: ... mov ax,3D00h mov dx,offset Just_file int 21h ... Just_file db 'file',0




Начало  Назад  Вперед