                                                        ПРИЛОЖЕНИЕ 2

              НАИБОЛЕЕ ЧАСТО ИСПОЛЬЗУЕМЫЕ ФУНКЦИИ MS DOS

     В данном приложении приведены сведения о некоторых распространенных
прерываниях  MS DOS.  Приводимая информация полезна при трассировке "по-
дозрительных" программ и их дизассемблировании. Более подробные сведения
можно   получить   в   электронном   справочнике  TECHHELP  Д.  Роллинга
(D.Rolling).  При написании данного приложения использовано  руководство
Microsoft MS DOS. Operating System 3.3. Programmer Reference Manual.

     Прерывание 21  фактически  не является прерыванием в строгом стысле
этого слова,  поскольку оно не ведет к приостановке какой-то  программы.
Это  просто  метод вызова фунцкий,  обеспечиваемых MS DOS и прежде всего
функции управления файловой системы. Эволюция MS DOS привела к тому, что
одни и те же операции выполняются разными функциями т.е.  дублируются, а
сам состав функций далек от логичности и ортогональности.  Тем не  менее
функционально  операции можно сгруппировать следующим образом (все числа
шестнадцатеричные).

    0-12 -  Обмен с символьными устройствами;
   12-24 -  Работа с файлами с использованием FCB;
   25    -  Установить вектор прерываний
   26    -  Создать программный сегмент
   27-29 -  Работа с файлами с использованием FCB;
   2A-2E -  Обработка даты и времени:
         2A - Выдать дату
         2B - Установить дату
         2C - Выдать время

   2F-38 -  Разные операции, в том числе:
         30 - Выдать номер версии DOS
         31 - Закончить и остаться резидентом (KEEP)
         35 - Выдать значения вектора прерывания для заданной функции

   39-3B -  Работа с каталогами;
   3C-46 -  Работа с файлами с использованием логических номеров;
   47    -  Работа с каталогами;
   48-...-  Дополнительные операции.

     Большинство операций использует параметры,  задаваемые в регистрах.
Для  некоторых операций параметр задается в виде строки ASCIIZ - тексто-
вой строки, заканчивающейся нулевым байтом.

     Операции 2F-38 используют вместо блока FCB  так  называемый  "номер
файла"  (file handle).  При создании или открытии файла или устройства в
регистре AX возвращается 16-разрядный номер  файла.  Значения  некоторых
номеров файлов определены по умолчанию:

         0000     Стандартый ввод. Может переназначаться.
         0001     Стандартый вывод. Может переназначаться.
         0002     Стандартый вывод сообщений.
                  Не может переназначаться.
         0003     Стандартый коммуникационный канал.
         0004     Стандартое устройство печати.

     Обычно функция MS DOS вызывается путем занесения номера  функции  в
регистр AX (точнее в его старший байт - AH) с последующим вызовом преры-
вания 21. Однако существуют и другие способы обращения к этим операциям,
например с помощью длинного вызова подпрограммы (FAR CALL). Вирусы могут
пользоваться нестандартными способами обращения к функциям  MS  DOS  для
маскировки и затруднения дизассемблирования кода.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=F  ▒▒▒▒▒▒▒
                      Открыть файл, используя FCB

       При входе DS:DX указывает на неоткрытый  блок  управления  файлом
(FCB).  Указанное в нем имя ищется в каталоге; если оно не найдено, то в
AL возвращается FF.  Если же файл найден, то в AL возвращается 00, а FCB
заполняется  следующим  образом:  Если  указан код устройства 0 (текущий
диск),  он заменяется фактическим кодом диска, являеющегося в данный мо-
мент текущим (1=A, 2=B и т.д.); поэтому переназначение текущего диска не
влияет на открытые файлы.  Поле текущего блока (байты  C-D)  обнуляется.
Длина  записи (байты E-F) устанавливается равной 80H.  Длина файл и дата
заполняются на основании информации в каталоге.  Если программа работает
с файлом,  используя размер записи,  отличный от 80H байт, установленных
по умолчанию,  она должна изменить ее в FCB;  она также должна заполнить
поля номера записи.  Это должно быть сделано до первого обращения к фай-
лу.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=10 ▒▒▒▒▒▒▒
                      Закрыть файл, используя FCB

     Эта операция заносит в каталог информацию об изменениях файла.  При
входе DS:DX указывает на открытый блок управления файлом (FCB).  Указан-
ный файл ищется в каталоге;  если он не найден, то DOS предполагает, что
была сменена дискета,  и в AL возвращается FF. Если же файл найден, то в
AL возвращается 00, и производится модификация каталога.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=11 ▒▒▒▒▒▒▒
              Искать первое имя по образцу, используя FCB

       При входе DS:DX указывает на неоткрытый  блок  управления  файлом
(FCB). В каталоге ищется первое имя, удовлетворяющее заданному в FCB об-
разцу (имя-образец может содержать символы "?"  в  позициях,  где  может
стоять любая литера). Если такое имя не найдено, то в AL возвращется FF;
иначе в AL возвращется 00, а текущий буфер DTA заполняется следующим об-
разом:  Если заданный FCB является расширенным, то в первый байт DTA за-
носится код FF, за ним следует 5 нулевых байтов, затем байт атрибутов из
заданного FCB,  код устройства (1=A,  2=B и т.д.), и затем 32 байта, со-
держащие копию найденного элемента каталога.  Таким образом, в DTA стро-
ится неоткрытый расширенный блок управления файлом с теми же атрибутами,
что и у заданного FCB.  Если же задан обычный (не расширенный FCB), то в
первый байт DTA заносится код устройства (1=A,  2=B и т.д.),  и затем 32
байта,  содержащие копию найденного элемента каталога.  Таким образом, в
DTA строится неоткрытый блок управления файлом. При использовании расши-
ренного FCB поиск производится следующим образом:
     1. Если байт атрибутов равен 0, то ищутся только имена обычных фай-
лов.  Элементы каталога, соответствующие метке тома, подкаталогам, скры-
тым и системным файлам не анализируются.
     2. Если установлены атрибуты скрытого  или  системного  файла,  или
подкаталога,  то  они включаются в поиск.  При этом выдаются как обычние
файлы так и файлы с соответствующими атрибутами.  Чтобы просмотреть  все
элементы каталога,  кроме метки тома,  следует указать в байте атрибутов
"скрытый" + "системный" + "подкаталог".
     3. Если  указан  атрибут метки тома,  то ищется только единственный
соответствующий элемент каталога.  Структура байта атрибутов приведена в
Приложении 2.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=12 ▒▒▒▒▒▒▒
            Искать следующее имя по образцу, используя FCB

       После обращения к операции 11,  обращение к операции 12 ищет сле-
дующее  удовлетворяющее заданному в FCB образцу имя.  Входные и выходные
параметры те же,  что и в операции 11. При этом промежуточная информация
храниться в зарезервированных полях заданного FCB; поэтому между обраще-
ниями к операциям 12 или 11 этот FCB не должен использоваться для других
операций.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=13 ▒▒▒▒▒▒▒
                      Удалить файл, используя FCB

       При входе  DS:DX  указывает  на  неоткрытый  блок FCB.  Все соот-
ветствующие элементы каталога и именумые ими файлы уничтожаются.  (Имя в
FCB может содержать символы "?" в позициях, где может стоять любая лите-
ра). Если таких элементов нет, в регистре AL возвращается FF, иначе 00.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=14 ▒▒▒▒▒▒▒
                Последовательное чтение, используя FCB

       При входе DS:DX указывает на открытый блок FCB. Запись, указывае-
мая номером текущего блока (байты C-D) и номером  текущей  записи  (байт
1F) пересылается в буфер DTA; номер записи увеличивается на 1. Длина за-
писи определяется из поля длины записи.  Если обнаружен конец  файла,  в
регистре AL возвращается 01 или 03. Код 01 указывает, что в буфер не пе-
реслано данных,  код 03 соответствует ситуации,  когда в файле  остались
данные,  но меньше, чем длина записи; в последнем случае запись в буфере
DTA дополняется нулевыми байтами.  Код 02 означает,  что системный буфер
слишком мал для обработки записи и запись переслана не полностью. Код 00
свидетельствует о нормальном завершении операции.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=15 ▒▒▒▒▒▒▒
                Последовательная запись, используя FCB

       При входе DS:DX указывает на открытый блок FCB.  Запись из буфера
DTA длиной,  указанной в поле длины записи,  записывается в файл в пози-
цию,  указываемую номером текущего блока и номером текущей записи;  (при
длине записи,  меньшей длины сектора, происходит буферизация). Номер за-
писи увеличивается на 1.  В регистре AL возвращается код завершения:  01
диск полон;  02 - системный буфер слишком мал для обработки записи и за-
пись переслана не полностью.  Код 00 свидетельствует о нормальном завер-
шении операции.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=16 ▒▒▒▒▒▒▒
                      Создать файл, используя FCB

       При входе DS:DX указывает на неоткрытый блок FCB. Указанное в нем
имя ищется в каталоге;  если оно найдено, то соответствующий элемент ка-
талога используется для нового файла,  иначе ищется пустой элемент; если
такового нет, в регистре AL возвращается FF. Иначе элемент каталога ини-
циализируется, устанавливается нулевая длина файла, файл открывается и в
регистре AL возвращается 00. Используя расширенный FCB с соответствующи-
ми атрибутами, можно пометить создаваемый файл как скрытый.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=17 ▒▒▒▒▒▒▒
                   Переименовать файл, используя FCB

       При входе DS:DX указывает на блок управления файлом (FCB), содер-
жащий второе имя непосредственно после первого,  т.е.  по адресу DS:DX +
11H (обычно эта часть FCB зарезервирована).  Все имена,  соответствующие
имени-образцу,  изменеются в соответствии со вторым именем. При этом ли-
теры имени файла в тех позициях,  где в имени-образце стоит "?" не изме-
няются.  При переименовании проверяется,  чтобы в каталоге не  появилось
два одинаковых имени. Если операция завершается успешно, AL содержит 00,
иначе (если имя не найдено или переименование привело бы к  дублированию
имени) в AL возвращается 00.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=19 ▒▒▒▒▒▒▒
                             Текущий диск

       В регистре  AL  возвращается код устройства,  являющегося текущим
диском (0=A, 1=B и т.д.).

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=1A ▒▒▒▒▒▒▒
                           Задать адрес DTA

       Область памяти,  на  которую указывает DS:DX,  становится текущим
буфером DTA. При операциях обмена DOS не допускает перехода через грани-
цу сегмента.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=21 ▒▒▒▒▒▒▒
                Чтение с прямым доступом, используя FCB

       При входе  DS:DX  указывает на открытый блок FCB.  Значения полей
номера блока и номера записи устанавливаются в соответствии со значением
поля номера записи для прямого доступа; соответствующая запись пересыла-
ется в буфер DTA. Если обнаружен конец файла, в регистре AL возвращается
01  или 03.  Код 01 указывает,  что в буфер не переслано данных,  код 03
соответствует ситуации,  когда в файле остались данные,  но меньше,  чем
длина записи; в последнем случае запись в буфере DTA дополняется нулевы-
ми байтами.  Код 02 означает,  что системный буфер слишком мал для обра-
ботки  записи и запись переслана не полностью.  Код 00 свидетельствует о
нормальном завершении операции.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=22 ▒▒▒▒▒▒▒
                Запись с прямым доступом, используя FCB

       При входе DS:DX указывает на открытый блок  FCB.  Значения  полей
номера блока и номера записи устанавливаются в соответствии со значением
поля номера записи для прямого доступа.  Запись из  буфера  DTA  длиной,
указанной  в  поле  длины записи,  записывается в файл в соответствующию
этим полям позицию. (при длине записи, меньшей длины сектора, происходит
буферизация).  Номер записи увеличивается на 1.  В регистре AL возвраща-
ется код завершения: 01 диск полон; 02 - системный буфер слишком мал для
обработки записи и запись переслана не полностью. Код 00 свидетельствует
о нормальном завершении операции.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=23 ▒▒▒▒▒▒▒
                 Определить длину файла, используя FCB

       При входе DS:DX указывает на неоткрытый блок FCB. Указанное в нем
имя  ищется  в каталоге;  если оно не найдено,  то в AL возвращается FF.
Если же файл найден,  то в AL возвращается 00, а в FCB в поле номера за-
писи для прямого доступа заносится число записей в файле.  Перед обраще-
нием к этой операции,  в FCB следует занести необходимую  длину  записи;
иначе будет получен неверный результат.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=24 ▒▒▒▒▒▒▒
     Задать поле номера записи для прямого доступа, используя FCB

       При входе DS:DX указывает на открытый блок FCB.  Эта операция за-
носит в поле номера записи для прямого доступа значение,  соответстующее
номеру текущего блока и номеру текущей записи.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=25 ▒▒▒▒▒▒▒
                     Установить вектор прерываний

       В таблицу векторов прерываний для прерывания с номером, указанным
в AL, заносится 4-х байтный адрес, содержащийся в DS:DX. Содержимое век-
тора прерываний может быть получено операцией 35.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=26 ▒▒▒▒▒▒▒
                      Создать программный сегмент

       При входе DX содержит сегментый адрес,  где создается новый прог-
раммный  сегмент.  При  этом текущий PSP (100H байт,  начиная с нулевого
байта текущего программного сегмента),  копируется в  новый  программный
сегмент.  В новом PSP изменяется поле размера памяти,  доступной данному
программному сегменту.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=27 ▒▒▒▒▒▒▒
                     Чтение блока (прямой доступ)

       При входе  DS:DX  указывает  на  открытый блок FCB;  в CX указано
число записей,  обязательно отличное от нуля.  Указанное  число  записей
(длина  записи определяется из поля длины записи) считывается из файла в
соответствии с полем номера записи для прямого доступа в буфер DTA. Если
обнаружен конец файла, в регистре AL возвращается 01 или 03. Код 01 ука-
зывает,  что последняя считанная запись передана целиком, код 03 означа-
ет,  что конец файла обнаружен посредине записи.  При достижении границы
сегмента (FFFF) во время пересылки в буфер  обмен  завершается  и  в  AL
возвращается 02. Код 00 свидетельствует о нормальном завершении операции
(все записи прочитаны полностью). В любом случае в регистре CX возвраща-
ется число фактически считанных записей и поля номера записи для прямого
доступа,  номера блока и номера записи увеличиваются соответствующим об-
разом;  после завершения операции они указывают на первую не прочитанную
запись.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=28 ▒▒▒▒▒▒▒
                     Запись блока (прямой доступ)

       Аналогично операции  27,  но производится не чтение,  а запись и,
возможно,  контрольное считывание.  Если на диске недостаточно места для
помещения заданного числа записей, то запись не производится и в регист-
ре AL возвращается 01.  Если при входе CX=0,  то запись не производится,
но длина файла устанавливается равной длине,  соответствующей номеру за-
писи для прямого доступа,  которая может быть больше или меньше  текущей
длины файла.  (При этом происходит выделение или освобождение кластеров,
принадлежащих файлу).


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=2A ▒▒▒▒▒▒▒
                              Выдать дату

       Возвращает текущую дату в CX:DX. CX содержит год после 1980 (0 -
1980, 1 - 1981 и т.д.); DH - номер месяца (1 - январь и т.д), DL - день.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=2B ▒▒▒▒▒▒▒
                            Установить дату

       При входе CX:DX содержат дату в том же формате,  что и в операции
2A. Если дата задана правильно, она устанавливается как текущая дата и в
AL возвращается 00, иначе дата не изменяется и в AL возвращается FF.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=2C ▒▒▒▒▒▒▒
                             Выдать время

       Возвращает текущее астрономическое время в CX:DX. CH содержит час
(0-23), CL - минуту (0-59), DH - секунду (0-59), DL - сотые доли секунды
(0-99).

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=30: ▒▒▒▒▒▒
                        Выдать номер версии DOS

       Выдает номер версии в регистрах AL (старшая часть - до точки),  и
AH (младшая часть - после точки). Для версий до 2.00, AL =0.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=31 ▒▒▒▒▒▒▒
                Закончить и остаться резидентом (KEEP)

       При входе в AL - код возврата, в DX - размер памяти в параграфах.
Эта операция завершает выполнение обратившегося к ней процесса  и  пыта-
ется  установить длину основного блока памяти этого процесса равным ука-
занному в в DX.  Никакие другие блоки памяти, принадлежащие данному про-
цессу, не освобождаются.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=35 ▒▒▒▒▒▒▒
        Выдать значения вектора прерывания для заданной функции

       При входе AL содержит номер прерывания. В регистрах ES:BX возвра-
щается адрес входа в программу обработки этого прерывания. Вектор преры-
вания может быть изменен операцией 25.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=3D ▒▒▒▒▒▒▒
                             Открыть файл

       При входе DS:DX указывает на строку ASCIIZ,  содержащую имя  уст-
ройства,  составное  имя  каталога  (path) и имя файла;  AL содержит код
доступа:  0 - открыть для чтения 1 - открыть для записи 2 - открыть  для
записи и чтения (модификации) Номер открытого файла возвращается в AX.
     Текущая позиция устанавливается на первый  байт  файла  (она  может
быть  изменена  операцией  42).  Полученный номер файла должен использо-
ваться при последующих обращениях к файлу. Время и дату создания/модифи-
кации файла можно получить операцией 57,  а атрибуты - операцией 43. Эта
операция открывает как обычные, так и скрытые файлы.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=3E ▒▒▒▒▒▒▒
                             Закрыть файл

       При входе BX содержит номер файла.  Системные буфера, связанные с
файлом, сбрасываются, и файл закрывается.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=3F ▒▒▒▒▒▒▒
                    Чтение из файла или устройства

       При входе  BX  содержит номер файла,  CX - число байт для чтения,
DS:DX - адрес буфера.  В AX возвра- щается число фактически  прочитанных
байт;  нулевое  значение  указывает на попытку читать после конца файла.
Операция пересылает указанное  число  байт  (CX)  по  указанному  адресу
(DS:DX) из файла начиная с текущей позиции и сдвигает текущую позицию на
число прочитанных байт.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=40 ▒▒▒▒▒▒▒
                     Запись в файл или устройство

       При входе BX содержит номер файла,  CX - число записываемых байт,
DS:DX - адрес буфера.  Операция пересылает указанное число байт (CX)  из
памяти  по  указанному адресу (DS:DX) в файл начиная с текущей позиции и
сдвигает текущую позицию на число пересланных байт.  В  AX  возвращается
число  фактически  записанных байт;  его отличие от заданого в BX свиде-
тельствует,  об ошибке (обычно переполнение диска). При этом не выдается
кода ошибки,  программа сама должна проверять совпадение заданной и фак-
тической длин.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=42 ▒▒▒▒▒▒▒
                   Изменить текущую позицию (Lseek)

       Текущая позиция определяет номер байта в файле,  на которым будет
выполняться следующая операция обмена.  При входе BX содержит номер фай-
ла,  AL - код операции,  CX:DX - необходимую позицию (старшая часть -  в
CX).  При выходе DX:AX содержит новую текущую позицию (старшая часть - в
DX). Операция перемещает текущую позицию в зависимости от занчения AL:

         AL =0 Позиция устанавливается относительно начала файла.
         AL =1 Позиция устанавливается относительно текущей позиции.
         AL =2 Позиция устанавливается относительно конца файла.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=43 ▒▒▒▒▒▒▒
                        Изменить атрибуты файла

       При входе AL содержит код операции,  DS:DX  указывает  на  строку
ASCIIZ,  содержащую имя устройства,  составное имя каталога (path) и имя
файла. Если AL =01, файлу приписываются атрибуты, заданные в CX. Если AL
=00,  атрибуты файла возвращаются в CX. структура поля атрибутов описана
в Проложении 2.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=48 ▒▒▒▒▒▒▒
                            Выделить память

       При входе в BX - длина необходимиого блока памяти в параграфах (в
параграфе 16 байт). После выполнения операции AX:0 указывает на выделен-
ный блок памяти.  Если выделить блок указанной длины невозможно, то в BX
возвращается размер максимального свободного блока (в параграфах).

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=49 ▒▒▒▒▒▒▒
                           Освободить память

       При входе  ES:0  указывает на начало освобождаемого блока памяти,
выделенного операцией 48.  Блок возвращается в пул  динамической  памяти
операционной системы.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=4A ▒▒▒▒▒▒▒
                Изменить длину блока памяти (Setblock)

       При входе ES:0 указывает на начало освобождаемого  блока  памяти,
выделенного операцией 48. При входе в BX - новая (требуемая) длина блока
памяти в параграфах. DOS пытается удлинить или укоротить указанный блок.
Если  увеличить блок до заданной длины невозможно,  то в BX возвращается
максимальный возможный размер для данного блока (в параграфах).

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=4B ▒▒▒▒▒▒▒
               Загрузить или выполнить программу (Exec)

       Эта операция  позволяет одной программе загрузить другую и,  если
не указано иначе,  начать ее выполнение.  При входе DS:DX  указывает  на
строку ASCIIZ,  содержащую имя устройства, составное имя каталога (path)
и имя файла, содержащего загружаемую задачу. ES:BX указывают на блок па-
раметров для загрузчика, а AL содержит код подоперации:

AL = 0 Загрузить и выполнить программу. Для загруженной программы созда-
        ется PSP Программного сегмента (PSP) и в  нем  устанавличаваются
        соответствующие  адреса  реакции  на завершение и на Ctrl-Break.
        Блок параметров: WORD сегментный адрес передаваемой среды. DWORD
        указатель на командную строку,  помещаемую в PSP +80h DWORD ука-
        затель на FCB, помещаемый в PSP +5Ch DWORD указатель на FCB, по-
        мещаемый в PSP +6Ch

AL = 3 Загрузить и не выполнять.

      Когда программа получает управление, ей выделяется вся имеющаяся у
DOS память.  До того,  как загружать другую задачу,  родительская задача
должна освободить для нее память операцией 4A. Как правило, задача осво-
бождает всю неиспользуемую ею память.

      Операция Exec  обращается   к   загрузчику,   являющемуся   частью
COMMAND.COM  и  располагающемуся в конце памяти.  Если программа затерла
загрузчик,  то при выполнении этой операции он  подзагружается,  затирая
последние  1536 байт ОЗУ.  Если вся память выделена задаче операцией 48,
то Exec выдаст ошибку.

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=4C ▒▒▒▒▒▒▒
                          Завершение процесса

       При входе  в  AL - код возврата.  Операция заканчивает выполнение
текущего процесса и передает управление его родителю.  При этом выдается
указанный  код  возврата,  который  может анализироваться командами IF и
ERRORLEVEL в командных файлах и операцией 4D в родительской задаче.  Все
файлы, открытые заканчивающейся задачей закрываются.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=56 ▒▒▒▒▒▒▒
                          Переименовать файл

       При входе  DS:DX указывает на строку ASCIIZ,  содержащую имя уст-
ройства,  составное имя каталога (path) и имя файла,  который необходимо
переименовать.  ES:DI  указывает  на  строку  ASCIIZ,  содержащую  новое
составное имя файла.  Если новое имя содержит имя устройства, оно должно
совпадать  с  устройством  в  старом имени.  Имена каталогов могут отли-
чаться,  что позволяет этой операцией не только переименовать файл, но и
переместить его в другой каталог.


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ AH=57 ▒▒▒▒▒▒▒
                Дата и время создания/модификации файла

       При входе  AL содержит 00 или 01,  BX содержит номер файла.  Если
AL=00, то в DX и CX возвращаются дата и время создания/модификации файла
из  каталога.  Если  AL=01,  то  в каталог заносятся дата и время созда-
ния/модификации файла из регистров DX и CX.



















































































