мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
asm:lesson6 [20/10/2010 21:15] arabusovasm:lesson6 [21/10/2010 16:07] arabusov
Строка 293: Строка 293:
 пример  показывает  возможность  использования  в  программе пример  показывает  возможность  использования  в  программе
 слова MPY вместо обычного мнемокода MUL. слова MPY вместо обычного мнемокода MUL.
 +
 +===== Работа с файлами в MS-DOS =====
 +
 +==== Функции типа дескриптора ====
 +
 +В MS-DOS начиная со второй версии файловая система стала иерархической, т.е. появились каталоги (или их можно назвать папками, или директориями). С иерархической файловой системой вы знакомы из опыта общения с OS Windows. Полное имя файла представляет из себя обозначение дисковода, путь до файла и имя файла. По ограничениям MS-DOS размер имени файла не может превышать 8 символов на собственно имя и 3 символов на расширение. Полное имя файла в MS-DOS можно представить, например, так:
 +    C:\SYSTEM\COMMAND.COM
 +Специфика MS-DOS такова, что в имени файла регистр не учитывается, то есть вы можете записать как COMMAND.COM, так и command.com. Приведённый пример вообще говоря представляется в виде ASCIIZ последовательности - это значит, что каждому символу соответствует число из таблицы кодов ASCII символов, а также в конец строки добавляется число 0, то есть запись
 +   C:\SYSTEM\COMMAND.COM
 +преобразуется в
 +   43 3a 5c 53 59 53 54 45 4d 5c 43 4f 4d 4d 41 4e 44 2e 43 4f 4d 00
 +Для работы с файлом с помощью функции типа дескриптора, нужно поместить адрес имени файла в DS:DX. В регистр ah помещается номер функции, после чего вызывается прерывание int 21H. Все функции типа дескриптора после выполнения возвращают опущенный флаг переноса, если функция выполнена успешно и наоборот. Чтобы совершить переход к вашему обработчику ошибки, выполните команду
 +    jc      error
 +где error - указатель на начало обработчика.
 +Теперь рассмотрим некоторые функции типа дескриптора, которые нам сегодня пригодятся.
 +=== Создание файла ===
 +По заданному в коде ASCIIZ пути создаёт новый файл на указанном или текущем диске или на указанном или текущем каталоге. Если указанный файл существует, то он усекается до нулевой длины. В любом случае открывается файл и возвращается дескриптор (16-разрядное число, которое нужно просто запомнить - именно с помощью этого числа в дальнейшем программа сможет обратиться к именно этому файлу).
 +При вызове:
 +  * AH = 3cH
 +  * CX = атрибут (в нашем случае всегда 0)
 +  * DS:DX - адрес строки, содержащей имя файла
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = дескриптор
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Открытие файла ===
 +По заданному в коде ASCIIZ пути открывает файл на указанном или текущем диске или на указанном или текущем каталоге. Возвращается дескриптор.
 +При вызове:
 +  * AH = 3dH
 +  * AL = режим доступа
 +   Биты      Описание
 +   0-2       000=чтение
 +             001=запись
 +             010=чтение/запись
 +  * DS:DX - адрес строки, содержащей имя файла
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = дескриптор
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Закрытие файла ===
 +При вызове:
 +   * AH = 3Eh
 +   * BX =  дескриптор
 +При возврате:
 +Успешно - флаг переноса сброшен
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Чтение файла ===
 +При вызове:
 +  * AH = 3Fh
 +  * BX = дескриптор
 +  * CX = число байт для чтения
 +  * DS:DX = адрес буфера
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = число переданных байтов (может быть меньше CX!)
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки
 +=== Запись в файл ===
 +При вызове:
 +  * AH = 40h
 +  * BX = дескриптор
 +  * CX = число байт для вывода записи
 +  * DS:DX = адрес буфера
 +При возврате:
 +Успешно - флаг переноса сброшен
 +  * AX = число переданных байтов (может быть меньше CX!)
 +Неудачно - флаг переноса установлен
 +  * AX = код ошибки