Пришло время рассмотреть работу с файлами.
Для того, чтобы прочитать содержимое файла необходимо вначале открыть его. Это позволяет сделать :
Функция 3Dh прерывания 21h - открытие файла:
Вход: | AH = 3Dh |
AL = тип открытия (00 - только чтение, 01 - только запись, 02 - чтение / запись)
DS:DX = адрес ASCII-строки с именем файла
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