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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
asm:lesson6 [21/10/2010 15:14] arabusovasm:lesson6 [21/10/2010 16:07] arabusov
Строка 294: Строка 294:
 слова 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 = код ошибки