ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


Смотрите настольные наборы из дерева подробнее
ГЛАВА 1  СИСТЕМНЫЕ ВЫЗОВЫ
     __________________________________________________________

     1.1      Введение
     1.1.1      Замененные системные вызовы
     1.1.2      Пользование этим пособием
     1.2      Стандартный символьный ввод/вывод
     1.3      Управление памятью
     1.4      Управление программной средой
     1.4.1      Загрузка и выполнение программ
     1.4.2      Загрузка наложением
     1.5      Управление файловой и каталоговой системами
     1.5.1      Хендл
     1.5.2      Функции работы с файлами
     1.5.3      Функции работы с устройствами
     1.5.4      Функции работы с каталогами
     1.5.5      Атрибуты файла
     1.6      Сеть Microsoft Networks
     1.7      Поддержка национальных алфавитов
     1.8      Разные функции управления системой
     1.9      Старые системные вызовы
     1.9.1      Блок управления файлом (FCB)
     1.10     Использование системных вызовов
     1.10.1     Использование прерываний
     1.10.2     Вызов функций
     1.10.3     Вызов функций из языков высокого уровня
     1.10.4     Регистры
     1.10.5     Обработка ошибок
     1.10.6     Структура описания системных вызовов
     1.11     Прерывания
     1.11.1     Ограничения
     1.11.2     Требования к процедуре обработки прерывания 24Н
     1.12     Функции




     1.1 Введение

     Ресурсы  операционной  системы MS-DOS могут быть вызваны
из любой прикладной программы.
     Использование системных  вызовов  значительно  облегчает
написание    машинно-независимых   программ   и   увеличивает
возможность  того,что  ваши  программы  будут  совместимы   с
дальнейшими   версиями   MS-DOS.   Системные   вызовы  MS-DOS
подразделяются на несколько категорий:

     -Стандартный символьный ввод/вывод
     -Управление памятью
     -Управление программной средой
     -Управление файловой и каталоговой системами
     -Функции сети Mikrosoft Network
     -Система поддержки национальных алфавитов
     -Разное


                              - 6 -



     Обращение  к  этим  функциям  осуществляется  с  помощью
системы  прерываний. Для этого используются номера прерываний
20Н-27Н; 28Н-40Н - зарезервированы. Прерывание с номером  21Н
-   стандартное  средство  обращения  к  большинству  функций
MS-DOS. В  некоторых  случаях  для  уточнения  вида  операций
используется  регистр  AX.  Каждое прерывание или обращение к
функции  использует  значения  в  различных   регистрах   для
передачи или возврашения специальной информации.

     1.1.1 Изменения

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

     1.1.2 Пользование настоящим руководством

     Первая часть этой главы содержит общее описание работы с
такими функциями, как управление памятью, файловой системой и
программной  средой,  а  также  краткое  описание большинства
системных  вызовов.  Конец  главы   дает   описание   каждого
прерывания и функции подробно.
     Описания     системных     вызовов     расположены    по
порядку, согласно их номеров.
     Вторая глава посвящена драйверам устройств MS-DOS.
     Главы 3 и  4  содержат  более  детальную  информацию  об
операционной  системе,  в  частности,  о  работе  с  дисковым
пространством и управляюшими блоками, о  порядке  загрузки  и
выполнения прикладных программ.
     Глава 5 посвящена работе с национальными алфавитами.
     Глава  6  описывает  структуру  файлов .exe и порядок их
загрузки (для версий до 2.0).
     Глава 7 дает описание формата об'ектного модуля INTEL.
     Глава 8 содержит рекомендации программистам.

           1.2 Стандартный символьный ввод/вывод

     Функции   символьного   ввода/вывода   охватывают    все
устройства   посимвольной  обработки  информации  такие,  как
консоль, принтер  и  последовательный  порт.  Если  программа
использует   эти   функции,   то  ее  ввод/вывод  может  быть
переадресован.
     В  таблице 1.1 приведены функции стандартного символьного
ввода/вывода.

     Таблица 1.1
     Функции стандартного символьного ввода/вывода.
     __________________________________________________________
     Код    Функция                Описание
     _______________________________________________________________
     01H  Чтение с клавиатуры   Чтение символа со стандартного
          и эхо                 ввода и  эхом  на  стандартный
                                вывод
     02H  Отобразить  символ    Посылает символ на стандартный
                                вывод

                              - 7 -


     03H  Дополнительный ввод   Чтение символа со стандартного
                                дополнительного ввода
     04H  Дополнительный вывод  Посылает символ на стандартный
                                дополнительный вывод
     05H  Печать символа        Посылает символ на стандартный
                                принтер
     06H  Прямой ввод/вывод     Чтение символа со стандартного
          с консоли             ввода  или  передача  его   на
                                стандартный вывод
     07H  Прямой  ввод  с       Чтение символа со стандартного
          консоли               ввода
     08H  Чтение с клавиатуры   Чтение символа со стандартного
                                ввода
     09H  Отобразить строку     Передача строки на стандартный
                                вывод
     0AH  Чтение с клавиатуры   Чтение символа со стандартного
          через буфер           ввода
     0BH  Опрос клавиатуры      Опрос  состояния  стандартного
                                буфера ввода
     0CH  Очистить  буфер,      Очищает стандартный буфер вво-
          чтение клавиатуры     да  и  вызывает одну из  стан-
                                дартных функций ввода/вывода
     __________________________________________________________

     Хотя  некоторые функции символьного ввода/вывода кажутся
одинаковыми,  на  самом  деле  они  отличаются  проверкой  на
наличие управляющих символов, а также выводом эхо-символов на
стандартный  вывод.  Детальное  описание  различий будет дано
ниже в этой главе.

     1.3 Управление памятью

     MS_DOS ведет учет всех выделенных областей памяти  путем
помещения  в  начало  каждой  такой  области блока управления
памятью.  Этот  блок  описывает  величину   участка   и   имя
программы,  которой  он  выделен, а также ссылку на следующий
участок  памяти.  Если  участок  не  выделен,  он   считается
доступным.
     В таблице 1.2 приводятся функции управления памятью.

     Таблица 1.2
     __________________________________________________________
     Код   Функция             Описание
     ___________________________________________________________
     48H   Выделить память     Запрос на выделение участка
                               памяти
     49H   Освободить выде-    Освобождение участка памяти
           ленную память       выделенного ранее  функцией
                               48Н
     4AH   Установить          Изменить размер выделенного
           участок             участка памяти
     __________________________________________________________

     Когда    прикладная    программа    делает   запрос   на
дополнительную  память  с  помощью  функции   48H,   MS   DOS
подыскивает  подходящий по величине доступный участок памяти,
удовлетворяющий запросу. Если она  находит  такой  блок,  она
изменяет  блок  управления  памятью  для индикации вызывающей
программе. Если найденный блок больше необходимого, то MS-DOS
изменяет соответствующее  поле  в  блоке  управления  памятью

                              - 8 -



(поле  размера)  на запрашиваемый размер и создает новый блок
управления  памятью  в  начале   образовавшегося   свободного
участка  памяти,  и  тем  самым дает понять, что этот участок
доступен. Кроме того, он обновляет ссылки в этом же  блоке  и
присоединяет  этот  блок ко всей цепочке свободной памяти. MS
DOS  затем  возвращает   сегментный   адрес   первого   байта
выделенной памяти вызывающей программе.
     Если  программа  освобождает  выделенный участок памяти с
помощью функции 49H, MS-DOS изменяет блок управления  памятью,
инициируя доступность этого участка (непринадлежность ни одной
из программ).
     Если  программа  использует  функцию  4АН   для   сужения
выделенного   участка   памяти,   MS-DOS  создает  новый  блок
управления памятью и  присоединяет  его  к  остальной  цепочке
управляющих   блоков. При  использовании  той-же  функции  для
расширения выделенной памяти,  MS-DOS  рассматривает  это  как
простой  запрос  на  выделение  памяти и сегментного адреса не
возвращает. В этом   случае   дополнительная   память   просто
присоединяется к существующему управляющему блоку.
     Если  MS-DOS  не  находит участок памяти, удовлетворяющий
запросу, сделанному с помощью функций 48H и 4AH, в  вызывающую
программу возвращается код ошибки.
     При   получении  управления,  программа  должна  вызвать
функцию 4AH для сужения начально выделенного  участка  памяти
(участок,   начинающийся  с  префикса  сегмента  кодов).  Это
освобождает ненужную память  и  значительно  оптимизирует  ее
распределение     для    решения    последующих    задач    в
мультипрограмных средах.
     При выходе из прикладной программы, MS-DOS автоматически
освобождает выделенную ей  память  перед  тем,  как  передать
управление  вызывавшей программе (для прикладных программ это
обычно command.com). DOS освобождает любую память  выделенную
дочерним программам.
     Любая  программа,  изменяющая  память, не выделенную ей,
вероятнее всего разрушит по  крайней  мере  один  управляющий
блок. Это может вызвать ошибку при дальнейшей работе MS-DOS с
цепочкой управляющих блоков. В этих случаях лучшее средство -
перезагрузка системы.

     1.4 Управление програмной средой

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

     Таблица 1.3
     Функции управления программной средой
     ________________________________________________________
     Код  Функция               Описание
     ________________________________________________________
     31Н  Сохранение программы  Завершение программы и переда-
                                ча управления вызвавшему
                                процессу.Завершенная программа
                                сохраняется в памяти
     4ВН  Загрузить и выпол-    Загрузить и выполнить програм-
          нить программу или    му или загрузить наложением
          наложить              без выполнения

                              - 9 -


     4СН  Завершить программу   Передача управления вызвавшему
                                процессу
     4DH  Получить возвраща-    -----"------
          емый код при выходе
          из дочерней программы
     62Н  Получить PSP          Получить сегментный  адрес
                                префикса  сегмента  кодов
                                текущей программы
     ________________________________________________________

     Функция 4ВН включает две подфункции: 4В00Н (загрузить  и
выполнить)  и  4В03Н  (загрузить  наложением). Различия будут
описаны ниже.

     1.4.1 Загрузка и выполнение программы

     При  пользовании   функцией   4В00Н,   MS-DOS   выделяет
память,заполняет префикс сегмента кодов, адрес которого равен
адресу  выделенной  памяти, загружает программу и передает ей
управление. По ее завершении, управление передается вызвавшей
программе.
     Command.com  использует  функцию  4В00Н   для   загрузки
выполнения командных файлов. Прикладные программы имеют ту же
степень контроля за этими процессами, что и command.com.
     В  дополнение  к  сказанному,  ниже приводятся некоторые
различия в загрузке файлов с расширениями .com и .exe.

     Загрузка файлов .com

     Когда command.com загружает и выполняет  .com  файл,  он
выделяет всю доступную память и устанавливает указатель стека
на  100Н  байт от конца доступной памяти. Если .com программа
намерена сузить первоначально выделенный участок  памяти,  то
перед  этим  она  должна  создать свой собственный стэк, т.к.
стэк, созданный по умолчанию, будет утерян.
     Если  загруженной  программе  выделяется  вся  доступная
память  -  как  .com  программе  -  или  она запрашивает ее с
помощью функции  48Н,  MS-DOS  выделяет  ей  память,  занятую
временной   (транзитной)   частью   файла  command.com.  Если
прикладная  программа  изменяет  эту  часть  памяти,  то  для
продолжения  своей  работы  MS-DOS  должна  перезагрузить эту
часть файла. При выходе из программы (через функцию 31Н)  без
освобождения    достаточного     участка     памяти,  система
останавливается   и   должна   быть   перезагружена.    Чтобы
максимально  снизить  вероятность  такого  хода событий, .com
программа  должна  использовать  функцию  4АН   для   сужения
первоначально выделенной памяти перед дальнейшими действиями.
Кроме того, все программы, память которым выделялась функцией
48Н, должны освобождать эту память.

                             - 10 -


     Загрузка .exe программ

     Когда  command.com загружает и выполняет .exe программу,
помимо памяти, выделяемой для размещения самой программы,  он
выделяет  память,указанную  в полях MAX-ALLOC заголовка файла
(если такой  размер  доступен)  и  MIN-ALLOC  со  смещениями,
соответственно 0СН и 0АН.
     Более  детальное описание порядка загрузки файлов .exe и
.com дано в Главе 3 "Техническое описание MS-DOS" и  Главе  4
"Управляющие блоки и рабочие области MS-DOS".

     1.4.2 Загрузка наложением

     При  обращении  к  функции  4В03Н  вызывающая  программа
должна передать системе сегментный адрес, начиная с которого,
будет  наложена  дочерняя  программа.   По   ее   выполнении,
управление  возвращается вызвавшему процессу. Важно отметить,
что MS-DOS никоим образом не вмешивается в эту процедуру и не
пишет префикс сегмента кодов для налагаемой программы.
     Кроме   того,   MS-DOS   не   проверяет   принадлежность
загружаемой памяти  вызывающей  программе.  Если  загружаемая
память  не  принадлежит  вызывающей  программе,  то вероятнее
всего  будет  разрушен  один  из  управляющих   блоков,   что
неминуемо  приведет  в  дальнейшем  к  ошибкам  при выделении
памяти.
     Поэтому    программа,    делающая    накладку,    должна
предусмотреть  для  нее  память путем обращения к функции 4АН
для сужения первоначально выделенной памяти , а затем вызвать
функцию 48Н для выделения памяти для накладки.

     1.5 Управление файловой и каталоговой системами

     Иерархическая (многоуровневая) файловая  система  MS-DOS
схожа  с  файловой системой ОС XENIX. Описание многоуровневой
каталоговой системы и работы с ней дано в  MS-DOS  СПРАВОЧНИК
ПОЛЬЗОВАТЕЛЯ.

     1.5.1 Логический номер файла (хендл)

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

     Таблица 1.4
     Стандартные логические номера устройств
     ________________________________________________________
     Хендл  Стандартное устройство    Комментарий
     ________________________________________________________
     0      Устройство ввода          Может быть переадресо-
                                      вано  из  командной
                                      строки
     1      Устройство вывода         ------"------
     2      Сообщения об ошибках
     3      Дополнительное
            устройство

                             - 11 -


     4      Принтер
     _______________________________________________________

     При создании или открытии файла система присваевает  ему
первый  доступный  хендл.  Учитывая  то,  что программа может
иметь   двадцать   открытых   хендлов    ,    включая    пять
предопределенных,  открыть программно можно только пятнадцать
.   Обращением   к   функции   46Н    можно    активизировать
альтернативные  файлы или устройства под стандартным хендлом.
Подробно эта функция будет описана ниже в этой главе.

     1.5.2 Функции работы с файлами

     MS-DOS рассматривает файл  как  поток  байт,  без  учета
записевой  структуры  и  метода доступа. Прикладная программа
сама должна определить эти условия.  При  чтении  или  записи
из/в   файл   требуется   лишь  указать  буфер  и  количество
читаемых/записываемых байт.

     Таблица 1.5
     Функции работы с файлами
     ________________________________________________________
     Код  Функция              Описание
     ________________________________________________________
     3СН  Создать хендл        Создает   файл
     3DH  Открыть хендл        Открывает файл
     3ЕН  Закрыть хендл        Закрывает файл
     3FH  Читать хендл         Читает из файла
     40Н  Записать в хендл     Записывает в файл
     42Н  Сдвинуть             Позиционирует  указатель
          указатель файла      чтение / запись в файле
     45Н  Дубликат хендла      Создает новый хендл, который
                               относится к тому  же  файлу,
                               что и существующий хендл
     46Н  Активизировать       Относит существующий хендл к
          дубликат             тому же файлу, что и  другой
                               существующий хендл
     5АН  Создать временный    Создает  временный  файл  с
          файл                 уникальным именем
     5ВН  Создать новый        Пытается создать новый файл,
          файл                 если указанное имя уникально
     67Н  Установить счет      Увеличивает  или   уменьшает
          хендлов              количество файлов , которое
                               программа   может   открыть
                               одновременно
     68Н  Снести в файл        Сносит все данные с буфера в
                               файл, не закрывая его.
     _______________________________________________________

     Разделение доступа к файлу

     Версия 3.1 MS-DOS ввела  функции  разделения  доступа  к
файлам,  что  позволило разным программам иметь одновременный
доступ  к  одним  и  тем  же  файлам.  Эти  ресурсы   системы
функционируют  только  после введения соответствующей команды
на загрузку системы разделения доступа к файлам.
     Эти функции приведены  в  таблице  1.6.  Если  указанная
система   не   загружена,   то  эти  функции  не  могут  быть
использованы.  Функция  3DH  может  работать   в   нескольких
режимах.

                             - 12 -



     Таблица 1.6
     Функции разделения доступа к файлам
     _________________________________________________________
     Код    Функция           Описание
     _________________________________________________________
     3DH    Открыть хендл     Открывает файл в  одном  из
                              режимов  разделения.
     440ВН  Повторить         (перед прерыванием 24Н) Опреде-
            ввод/вывод        ляет кол-во  повторов  операций
                              ввода/вывода при  сбоях из - за
                              нарушения соглашений  системы
                              разделения.
     5С00Н  Блокировать       Блокирует участок файла.
     5С01Н  Разблокировать    Разблокировать участок файла.
     ________________________________________________________

     1.5.3 Функции работы с устройствами

     Управление вводом/выводом для устройств осуществляется с
помощью  функции  44Н,  которая включает несколько подфункций
для реализации  устройство-ориентированных  задач.  Некоторые
формы  этих  функций  требуют наличия драйвера устройства для
поддержки интерфейса ввода/вывода.

     Таблица 1.7
     Функции работы с устройствами
     __________________________________________________________
     Код       Функция               Описание
     __________________________________________________________
     4400Н,01Н Упр.ввод/вывод(УВВ)   Выдать/установить описание
               Данные                устройства
     4402Н,03Н УВВ Символ            Выдать/установить данные
                                     устройства символьной об-
                                     работки
     4404Н,05Н УВВ Блок              Выдать/установить данные
                                     устройства блоковой пере-
                                     дачи
     4406Н,07Н УВВ Статус            Проверка состояния устрой-
                                     ства по ввод/вывод
     4408Н     УВВ Сменный           Проверяет содержит ли уст-
                                     ройство блоковой передачи
                                     сменный диск
     440СН     Общее УВВ (для        Устанавливает общее УВВ
               хендлов)              для хендлов и поддержи-
                                     вает кодовые страницы для
                                     устройств или возвращает
                                     DCBS-информацию
     440DH     Общее УВВ (для        Устанавливает общее УВВ
               устройств)            для устройств
     440ЕН,0FH Выдать/установить     Выдать/установить карту
               УВВ карту дисковода   логического дисковода
     ___________________________________________________________

     Некоторые   формы   функции   ввода/вывода   могут   быть
использованы только  в  сети  Microsoft  Networks.  Эти  формы
перечислены в разделе 1.6, "Сети Microsoft Networks".

                             - 13 -



     1.5.4. Функции работы с каталогами.

     Вход  в  каталог  представляет  собой  32-байтную запись,
которая включает имя  файла,  его  расширение,  дату  и  время
последнего   изменения   и  его  размер.  Вход  в  подкаталоги
аналогичен  входу  в  корневом  каталоге.  Каталоговые   входы
подробно описаны в Главе 3.
     Корневой   каталог   на   диске   содержит  фиксированное
количество входов: 64 на стандартном одностороннем диске,  112
на   стандартном   двустороннем   диске.  Для  жестких  дисков
количество каталогов зависит  от  конкретной  реализации  ДОС.
Подкаталог - это простой файл с уникальным атрибутом. Возможно
существование  любого  количества  подкаталогов на диске, если
это  позволяет  дисковое  пространство.  Глубина   вложенности
каталоговой   структуры,  таким  образом,  зависит  только  от
размера диска  и  максимальной  длины  маршрута,  то  есть  64
символа.  Ранние версии ДОС (до 2.0) содержали только корневой
каталог, который содержал файлы, но не подкаталоги.
     В таблице 1.8 приведены функции работы с каталогами.

     Таблица 1.8
     Функции работы с каталогами
     ________________________________________________________
     Код   Функция               Описание
     ________________________________________________________
     39Н   Создать каталог       Создает подкаталог
     3АН   Удалить каталог       Удаляет подкаталог
     3ВН   Изменить текущий      Изменяет текущий каталог
           каталог
     41Н   Удалить каталоговый   Удаляет файл
           вход
     43Н   Выдать/установить     Выдает или изменяет атрибуты
           атрибуты файла        файла
     47Н   Получить текущий      Возвращает имя текущего ката-
           каталог               лога для данного дисковода
     44ЕН  Найти первый файл     Поиск в каталоге по первому
                                 входу, удовлетворяещему имени
                                 файла
     4FH   Найти следующий       Поиск в каталоге по входу,
           файл                  следующему за входом, удовлет-
                                 воряющим имени файла
     56Н   Изменить вход ка-     Переименование файла
           талога
     57Н   Выдать/установить     Изменяет время и дату послед-
           дату/время файла      него изменения каталогового
                                 входа
     __________________________________________________________

     1.5.5. Атрибуты файла

     В таблице 1.9 приведены атрибуты файла и их представления
в байте атрибута каталогового входа (смещение  0ВН).  Атрибуты
могут быть проверены или изменены с помощью функции 43Н.


                             - 14 -


     Таблица 1.9
     Атрибуты файла
     _________________________________________________________
     Код     Описание
     _________________________________________________________

     00Н     Нормальный; можно читать и записывать без огра-
             ничений.
     01Н     Только для чтения; не может быть открыт для запи-
             си; файл с таким же именем не может быть открыт.
     02Н     Скрытый; не может быть найден поиском в каталоге.
     04Н     Системный; не может быть найден поиском в каталоге
     08Н     Метка тома; только один файл   может  иметь  такой
             атрибут; он должен быть в корневом каталоге.
     10Н     Подкаталог
     20Н     Архив; устанавливается сразу после изменения файла
             или отменяется командой Backup.
     __________________________________________________________
     Атрибуты метка тома (08Н) и подкаталог (10Н) не могут быть
изменены функцией 43Н.

     1.6 Сети Microsoft Networks (MN)

     Сети MN состоят из сервера  и  одной  или  более  рабочих
станций. В листе назначения MS-DOS  ведет  учет  всех  рабочих
станций,  дисководов  и  устройств, которые были переназначены
сервером.  Описание  порядка  работы  с  сетями  MN   дано   в
РУКОВОДСТВЕ  ОПЕРАТОРА  MICROSOFT NETWORKS (Microsoft Networks
manager's  guide)  и  в  РУКОВОДСТВЕ  ПОЛЬЗОВАТЕЛЯ   MICROSOFT
NETWORKS (Microsoft Networks user's guide).
     В таблице 1.10 приводятся функции работы с сетями MN.

     Таблица 1.10
     _________________________________________________________
     Код    Функция             Описание
     _________________________________________________________
     4409Н  УВВ. Определить     Проверяет, относится ли имя
            назначение имени    дисковода к локальному или пе-
                                реназначенному дисководу.
     440АН  УВВ. Определить     Проверяет, относится ли имя
            назначение хендла   устройства к локальному или
                                переназначенному устройству.
     5Е00Н  Получить имя стан-  Получает имя рабочей станции в
            ции                 сети.
     5Е02Н  Установка  принтера Определяет строку контрольных
                                символов, добавляемых в начало
                                каждого файла, посылаемого на
                                принтер сети.
     5F02Н  Получить вход с     Получает вход с листа назна-
            листа назначения    чения, который показывает имя
                                дисковода    и     устройства
                                рабочей   станции,   а  также
                                сетевое  имя   каталога   или
                                устройства     на    сервере,
                                которому   этот   вход    был
                                переназначен.
     5F03Н  Соединить в сети    Переназначает дисковод или уст-
                                ройство рабочей станции катало-
                                гу или устройству сервера.
     5F04Н Отменить сетевое     Отменяет действие предыдущей
           соединение           функции

                             - 15 -


     1.7 Поддержка национальных алфавитов

     Система   поддержки   национальных   алфавитов  в  MS-DOS
включает следующие ресурсы:

     - страна-зависимая информация;
     - поддержка национальных клавиатур;
     - программные интерфейсы поддержки национальных алфавитов;
     - утилиты.

     Страна-зависимая информация включает следующее:

     - время, дата, денежные знаки;
     - таблицы символьного преобразования типа  нижний/верхний
       регистр;
     - сравнительные таблицы для сортировки символов;
     - однобайтовые  символы,  используемые  по  соглашению в
       именах файлов.

     Таблица 1.7.1
     Функции работы с системой поддержки национальных алфавитов
     __________________________________________________________
     Код   Функция             Описание
     __________________________________________________________
     65Н   Получить расширен-  Возвращает информацию по стране,
           ную  информацию по  ссылку  на регистровую таблицу,
           стране              ссылку на таблицу преобразования
                               имен файлов по верхнему регистру
                               или ссылку на сравнительную таб-
                               лицу
     66Н   Выдать/установить   Выдает/устанавливает кодовую
           глобальную кодовую  страницу, используемую как самой
           страницу            системой, так и всеми устройст-
                               вами
     __________________________________________________________


     1.8. Различные функции управления системой.

     Оставшиеся системные вызовы имеют дело с такими ресурсами
системы  как  дисководы,  система  адресации и часы. В таблице
1.12 приведены эти функции.

     Таблица 1.12
     Различные функции управления системой
     _________________________________________________________
     Код  Функция              Описание
     _________________________________________________________
     0DH  Сброс диска          Очищает все буферы
     0ЕН  Выбор диска          Устанавливает дисковод по умол-
                               чанию
     19Н  Получить текущий     Возвращает текущий дисковод по
          диск                 умолчанию
     1АН  Установить адрес     Устанавливает буфер ввода/вывода
          обмена с диском      с/на диск
     1ВН  Получить данные дис- Возвращает эти данные
          ковода по умолчанию
     1СН  Получить данные дис- Возвращает эти данные
          ковода
     25Н  Установить вектор    Устанавливает адрес программы,

                             - 16 -


          прерывания           обслуживающей прерывание
     29Н  Разбор имени файла   Разбирает строку символов по
                               формату спецификации файла
     2АН  Получить дату        Возвращает системную дату
     2ВН  Установить дату      Устанавливает системную дату
     2СН  Получить время       Возвращает системное время
     2DH  Установить время     Устанавливает системное время
     2ЕН  Установка/сброс      Включает/выключает программу
          флага проверки       проверки диска
     2FH  Получить адрес       Возвращает адрес буфера ввода/
          обмена с диском      вывода при обмене с диском
     30Н  Получить номер вер-  Возвращает номер версии
          сии MS-DOS
     33Н  Проверка на          Возвращает состояние флага
          CONTROL+C            проверки  на CONTROL+C
     35Н  Получить вектор      Возвращает адрес программы,
          прерывания           обслуживающей прерывание
     36Н  Получить размер      Возврашает информацию о дис-
          свободной области    ковом пространстве
          диска
     38Н  Установить/получить  Устанавливает текущую страну
          информацию по стране или возвращает информацию по
                               стране
     54Н  Получить флаг        Возвращает состояние флага
          проверки             проверки диска
     _______________________________________________________

     1.9 Старые системные вызовы

     Большинство  замененных  системных  вызовов  имело дело с
файлами. В таблице 1.13 приведены  новые  функции,  заменившие
старые  системные вызовы. Хотя MS-DOS по-прежнему включает эти
старые системные вызовы, их использование допустимо  лишь  при
полной   совместимости  вашей  программы  с  ранними  версиями
MS-DOS.

     Таблица 1.13
     _________________________________________________________
     Старые функции              Были заменены на
     Код Функция                 Код  Функция
     _________________________________________________________
     00Н Закончить программу     4СН  Завершить программу
     0FH Открыть файл            3DH  Открыть хендл
     10Н Закрыть файл            3ЕН  Закрыть хендл
     11Н Поиск по первому входу  4ЕН  Найти первый файл
     12Н Поиск по следующему     4FH  Найти следующий файл
         входу
     13Н Удалить файл            41Н  Удалить каталоговый
                                      вход
     14Н Читать последовательно  3FH  Читать хендл
     15Н Записать последова-     40Н  Записать в хендл
         тельно
     16Н Создать файл            3СН  Создать хендл
                                 5АН  Создать временный файл
                                 5ВН  Создать новый файл
     17Н Переименовать файл      56Н  Изменить каталоговый
                                      вход
     21Н Читать выборочно        3FH  Читать хендл
     22Н Записать выборочно      40Н  Записать в хендл
     23Н Получить размер файла   42Н  Сдвинуть указатель файла

                             - 17 -


     24Н Установить относитель-  42Н  Сдвинуть указатель файла
         ную запись
     26Н Создать новый PSP       4ВН  Загрузить и выполнить
         (Префикс сегмента кодов)     программу или наложить
     27Н Выборочно читать блок   42Н  Сдвинуть указатель файла
                                 3FH  Читать хендл
     28Н Выборочно записать в    42Н  Сдвинуть указатель файла
         блок
                                 40Н  Записать в хендл
     _________________________________________________________
     Код  Прерывание             Код  Функция
     _________________________________________________________
     20Н  Конец программы        4СН  Завершить программу
     27Н  Закончить, но оставить 31Н  Сохранить программу
          в памяти
     _________________________________________________________

     1.9.1 Блок управления файлом  (FCB)

     Старые функции работы с файлами предусматривали наличие в
каждой  программе  блока  управления файлом для каждого файла.
Этот блок  содержит  такую  информацию,  как  имя  файла,  его
размер,  длина  записи и указатель на следующую запись. MS-DOS
поддерживает   большинство    этих    функций,    но    теперь
ориентированных на хендлы.
     Некоторые  описания старых функций относятся к неоткрытым
или открытым FCB. Неоткрытый  FCB  содержит  только  указатель
дисковода   и  имя  файла.  Открытый  FCB  содержит  все  поля
заполняемые функцией 0FH (открыть файл).
     Префикс сегмента кодов  (PSP)  включает  в  себя,  помимо
всего  прочего,  два  FCB  со  смещениями  5СН и 6СН. Описание
работы с PSP и FCB смотрите  в  Главе  4,  "Управляющие  блоки
MS-DOS и рабочие области". В таблице 1.14 приводятся поля FCB.

     Таблица 1.14
     Формат полей блока управления файлом
     _________________________________________________________
     Смещение
     16-осн.  Десятичн.  Байты  Поля
     _________________________________________________________
     00Н      0          1      Номер дисковода
     01Н      1          8      Имя файла
     09Н      9          3      Расширение
     0СН      12         2      Текущий блок
     0ЕН      14         2      Размер записи
     10Н      16         4      Размер файла
     14Н      20         2      Дата последней записи
     16Н      22         2      Время последней записи
     18н      24         8      Зарезервировано
     20Н      32         1      Текущая запись
     21Н      33         4      Относительная запись
     __________________________________________________________

     Поля FCB
     Номер дисковода:  Указывает  на  дисковод  (А=1,  В=2  и
т.д.).  При  создании  или  открытии  файла  это  поле  можно
сбрасывать в ноль для указания диска  по  умолчанию.  Функция
0FH устанавливает это поле по умолчанию.
     Имя  файла:  Восемь символов, выравненных по левому краю
и,  при  необходимости,  с  пробелами  в  хвосте.   Если   вы

                             - 18 -


указываете  имя  стандартного  устройства  (например PRN), не
нужно его оканчивать двоеточием.
     Расширение: Три  символа,  выравненных  по  левому  краю
и,при  необходимости,  с  пробелами в хвосте. Может содержать
одни пробелы (нет расширения).
     Текущий  блок:  Указывает  на  блок  (группа  из   128
записей),  содержащий текущую запись. Это поле и поле текущей
записи составляют указатель записи. Функция 0FH cбрасыват это
поле в ноль.
     Размер записи:  Размер  логической  записи  в  байтах.
Устанавливается  в  128  функцией  0FH. Если размер записи не
равен 128 байтам, то  это  поле  необходимо  выставить  после
открытия файла.
     Размер файла: Размер файла в байтах. Первое слово этого
4-байтного поля - младшее слово.
     Дата   последней   записи:  Дата  создания  файла  или
последних  изменений  в  нем.  Подполя  года,  месяца  и  дня
размещены в двух байтах:

     смещение 15Н      смещение 14Н
     г г г г г г г м   м м м д д д д д
    15             9   8   5 4       0

     Время   последней  записи:  Время  создания  файла  или
последних изменений в нем.  Подполя  часов,  минут  и  секунд
размещены в двух байтах:

     смещение 17Н      смещение 16Н
     ч ч ч ч ч м м м   м м м с с с с с
    15      11 10          5 4       0

     Зарезервировано: Зарезервировано системой.

     Текущая  запись:  Указывает  на  одну  из 128 записей в
текущем  блоке.  Это  поле  и  поле  Текущий  блок  составляют
указатель  записи. Функция 0FH не инициализирует это поле. Вам
необходимо выставить это поле перед  последовательными чтением
или записью из/в файл(а).

     Относительная   запись  :  Указывает  на  текущую запись,
считая от начала файла (0). Не инициализируется функцией  0FH.
Вам  необходимо  выставить  это поле перед выборочными чтением
или записью из/в файл(а). Если размер записи меньше  64  байт,
то  используется  оба  слова  этого поля, в противном случае -
только первые три байта.
     _________________________________________________________
     Примечание
                Если вы используете FCB  со  смещением  5СН  в
                префиксе сегмента кодов, то последний   байт
                поля Относительная запись является  первым
                байтом неформатированной области параметров,
                начинающейся со смещения 80Н. Это буфер обмена
                с диском по умолчанию.
     _________________________________________________________

     Расширенный FCB

     Расширенный  FCB  предназначен  для  создания  или поиска
каталоговых входов файлов со специальными атрибутами. При этом
добавляется 7-байтовый префикс к FCB:

                             - 19 -



     Название                Байты   Смещение
     ________________________________________

     Байт флага (FF)         1       07Н
     Зарезервированы         5       06Н
     Байт атрибута           1       01Н
     ________________________________________

     Атрибуты файла описаны ранее в этой главе в разделе 1.5.5
"Атрибуты файла".
     _________________________________________________________
     Примечание
               Не забывайте указывать на  начало  расширенного
               FCB   при   пользовании   функциями  0FH-16H  с
               расширенными  блоками.
     _________________________________________________________


     1.10 Использование системных вызовов

     Оставшаяся часть  главы  посвящена  описанию  прикладного
использования  системных вызовов. Указанные функции приводятся
как в алфавитном порядке, так и в порядке их номеров.

     1.10.1 Организация прерывания

     MS-DOS резервирует прерывания с номерами 28Н по  3FH  для
своих  собственных  нужд  и  ведет  таблицу  векторов (таблица
адресов программ, обслуживающих прерывания)  ,  размещенную  в
80Н-FCH.  Разумеется,  вы  можете  написать  свои  собственные
программы обслуживания этих прерываний ( Окончание  программы,
СONTROL+C  и  Критическая  ситуация),  и  в  этой главе дается
описание каждой. Большинство этих прерываний было заменено  на
вызовы соответствующих функций.
     Для    организации    прерывания   нужно        загрузить
необходимые  данные  в  регистры  и  дать  инструкцию  INT   c
соответствующим номером прерывания.

     1.10.2 Вызов функций
     Используйте следующую процедуру при вызове функций:
     1. Загрузите необходимые данные в регистры
     2. Загрузите номер функции в AH
     3. При необходимости, поместите код операции в AL
     4. Организуйте прерывание 21Н .


     1.10.3 Вызов функций из языков высокого уровня

     Вызов  функций  может  быть  осуществлен  из любого языка
высокого уровня, чей модуль об'еденяется с модулем, написанном
на языке ассемблер. В дополнение к этому  вы можете :
     - Организовать прерывание 86Н из СИ  для  прямого  вызова
       функции.
     - Использовать  функцию DOSXQQ языка ПАСКАЛЬ для прямого
       вызова функции.
     - Использовать директиву CALL или функцию USER для вызова
       необходимого ассемблерного кода  из   интерпретатора
       БЕЙСИКА.


                             - 20 -


     1.10.4 Сохранение регистров

     Когда MS-DOS получает управление  после  вызова  функции,
она  переключается  на  свой  внутренний  стэк и сохраняет все
регистры,  не  используемые  для  возврата   результатов   (за
исключением AX).

     1.10.4 Сообщения об ошибках

     Большинство функций MS-DOS версии 2.0 и позже при ошибке
устанавливают флаг переноса , возвращая код ошибки в  регистре
AX . В таблице 1.15 приведены эти коды и их значения.

     Таблица 1.15
     Коды ошибок, возвращаемых в регистре AX
     __________________________________________________________
     Код    Значение
     __________________________________________________________
     1      Неправильный код функции
     2      Файл не найден
     3      Маршрут не найден
     4      Слишком много открытых файлов
     5      Нет доступа
     6      Несуществующий хендл
     7      Разрушен блок управления памятью
     8      Памяти недостаточно
     9      Некорректный адрес участка памяти
     10     Неправильная среда
     11     Неправильный формат
     12     Неправильный код доступа
     13     Некорректные данные
     14     Зарезервировано
     15     Несуществующий дисковод
     16     Попытка удалить текущий каталог
     17     Устройство другое
     18     Нет больше файлов
     19     Диск защищен по записи
     20     Неисправен дисковод
     21     Дисковод не готов
     22     Несуществующий диск
     23     Ошибка циклического кода проверки
     24     Неправильная длина (операция с диском)
     25     Ошибка поиска
     26     Это не MS-DOS диск
     27     Сектор не найден
     28     Нет бумаги
     29     Ошибка записи
     30     Ошибка чтения
     31     Общий сбой
     32     Нарушение системы разделения
     33     Нарушение блокировки
     34     Плохой диск
     35     FCB недоступен
     36     Заступ за буфер разделения
     37     Зарезервировано
     38     Не завершена операция конец-файла
     39-49  Зарезервировано
     50     Несуществующая функция сети MN
     51     Не слышит удаленный компьютер
     52     Повторение имени в сети

                             - 21 -


     53     Сетевое имя не найдено
     54     Сеть занята
     55     Сетевое устройство больше не существует
     56     Превышен лимит команды сетевого ввода/вывода
     57     Механическая  ошибка сетевого адаптера
     58     Некорректный ответ из сети
     59     Непредусмотренная ошибка сети
     60     Несовместимый удаленный адаптер
     61     Очередь заполнена
     62     Неполная очередь
     63     Недостаточно места для вывода файла
     64     Сетевое имя было удалено
     65     Нет доступа
     66     Некорректный тип сетевого устройства
     67     Сетевое имя не найдено
     68     Превышен лимит сетевого имени
     69     Превышен лимит сеанса сетевого ввода/вывода
     70     Временная пауза
     71     Запрос сети не принят
     72     Пауза в переадресации ПУ или диска
     73-79  Зарезервировано
     80     Файл существует
     81     Зарезервировано
     82     Невыполнимо
     83     Сбой в прерывании 24
     84     Вне структуры
     85     Уже назначен
     86     Неправильный пароль
     87     Неправильный параметр
     88     Ошибка сетевой записи
     89     Нет такой функции в сети
     90     Запрашиваемый компонент системы не установлен
     __________________________________________________________

     В   случае   возврата  кода  ошибки  при  вызове  функций
пользуйтесь следующим выражением :
     JC  , где
      -  метка  программы  ,  обрабатывающей  ошибочную
                ситуацию в зависимости от содержимого регистра
                АХ.
     Некоторые  старые  системные вызовы возвращают значение в
регистре для индикации успеха или неуспеха операции. Проверьте
возвращаемый код и предпринимайте соответствующие действия.

     Расширенный код ошибок

     В  версиях  MS-DOS после 2.0 появились новые сообщения об
ошибках.  Их  использование  невозможно  в  старых   системных
вызовах.  Что бы обойти проблемы несовместимости, новые версии
системы  наложили  эти  новые  коды  на  старые,  стремясь   к
максимальной близости.
     Функция  59Н  (получить  расширенный код ошибки) была
специально введена для работы с этими новыми вызовами  и  дает
наиболее детальный анализ возвращаемого кода.

     1.10.6 Описания системных вызовов

     Для  вызова большинства функций необходимо предварительно
загрузить информацию в регистр(ы) и  организовать  прерывание.
Описание каждой функции в этой главе включает следующее :

                             - 22 -


      _  Диаграмму  регистровой структуры процессора 8088 и их
         содержимое до и после вызова функции
      _  Подробное описание загружаемой информации
      _  Описание функции
      _  Подробное описание возвращаемого значения
      _  Пример

     Пример иллюстрации регистровой структуры

     я_AX ( AH,AL )              SP              CS
     я_BX ( BH,BL )              BP              DS
     я_CX ( CH,CL )              SI              SS
     я_DX ( DH,DL )              DI              ES

     я_IP
     я_FLAGSh,FLAGSl  ( ФЛАГИ старший байт, ФЛАГИ младший байт)

                    Рис. 1.1

     Примеры программ

     Каждый  программный  пример  содержит об'явления данных и
необходимый код для вызова функции. Если не оговорено отдельно,
каждый пример  имеет  общий  скелет,  описывающий  сегменты  и
возвращающий   управление   системе.   Каждый   пример  должен
выполняться как .com файл. На рисунке  1.2  приводится  пример
законченной программы.

     code      segment
               assume  cs:code,ds:code,es:nothing,ss:nothing
               org     100H
     start:    jmp     begin
     ;
     filename  db      "b:\textfile.asc",0
     buffer    db      129 dup (?)
     handle    dw      ?
     ;
     begin:    open-handle filename,0  ; Открыть файл
               jc      error-open      ; Метка не показана
               mov     handle,ax       ; Сохранить
     read-line: read-handle handle,buffer,128 ; Читать 128
                                       ; байт
               jc      error-read      ; Метка не показана
               cmp     ax,0            ; Конец файла ?
               je      return          ; Да, возврат
               mov     bx,ax           ; Нет, читать АХ байт
               mov     buffer[bx],"$"  ; Признак конца строки
               display buffer          ; См. функцию 09Н
               jmp     read-line       ; Следующие 128 байт
     return    end-process 0           ; Возврат в MS-DOS
     last-inst:
     ;
     code      ends
               end     start

     Рис. 1.2 Пример программы с общим скелетом

     Для  придания  программам  более  законченого вида, в них
были вставлены макроопределения. Например,  предыдущий  пример
содержит    четыре    таких   макроопределения:   open-handle,

                             - 23 -


read-handle,  display  и  end-process.  Все   макроопределения
приводятся в конце этой главы.
     Как  описано  в  Главе  4, макроопределения подразумевают
среду .com файлов. В частности, все сегментные регистры должны
содержать   одинаковую   величину.   Для    экономии    памяти
макроопределения   оставляют   процедуры  теста  на  ошибку  и
сохранения  регистров  главному  коду.  Это  делает  их  более
короткими   и  удобными  для  применения  в  ваших  прикладных
ассемблерных программах.

     Обработка ошибок в программах-примерах

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

     В таблице 1.16 и 1.17 приводятся прерывания и функции в
порядке их  номеров .

     Таблица 1.16
     Прерывания MS-DOS
     __________________________________________________________
     Прерывание     Описание
     __________________________________________________________
     20Н            Закончить программу
     21Н            Вызов функции
     22Н            Закончить с адресом выхода
     23Н            Прервать по CONTROL+C
     24Н            Прервать по критической ошибке
     25Н            Читать диск абсолютно
     26Н            Записать на диск абсолютно
     27Н            Закончить, но сохранить в памяти
     28Н-3FH        Зарезервировано
     __________________________________________________________

     1.11 Прерывания

     Ниже приводится описание прерываний с 20Н по 27Н.

     ЗАКОНЧИТЬ ПРОГРАММУ (20Н)

     Вызов:         CS - сегментный адрес
                         префикса сегмента кодов (PSP)
     Возвращает:    --

     Комментарий:
     Прерывание  20Н  заканчивает текущую программу и передает
управление  системе.  Кроме  того,  закрываются  все  файлы  и
очищается  буфер  диска. CS перед прерыванием должен содержать
сегментный адрес PSP.
     Прерывание   20Н   введено   только    для    обеспечения
совместимости  с  версиями  системы  до  2.0.  Новые программы
должны использовать  функцию  4СН  (  Завершить  программу  ),
которая  возвращает  в  вызвавший  процесс код завершения и не
требует загрузки в CS сегментного адреса PSP.
     Ниже  перечислены  процедуры  выходов,   адреса   которых
восстанавливаются из PSP:

                             - 24 -


     Смещение       Адрес выхода по
     __________________________________
     0АН            Закончить программу
     0ЕН            CONTROL+C
     12Н            Критическая ошибка
     __________________________________
     Все буферы файлов сносятся на диск
     ___________________________________________________________
     Примечание:
                    Перед организацией этого прерывания вам
                    необходимо закрыть все измененные в вашей
                    программе файлы. В противном случае их
                    длина будет записана в каталог не
                    правильно.  См. функции 10Н и 3ЕН по
                    закрытию файлов. Если  загружена  система
                    разделения,   то  перед  прерыванием  вам
                    нужно снять всю блокировку.  См.  функцию
                    5СН.
     __________________________________________________________

     Макроопределение:

     terminate      macro
                    int 20H
                    endm

     Пример:
     Следующая  программа  выводит  на   экран   сообщение   и
возвращает управление системе.

     message  db "displayed by int20H example",0DH,0AH,"$"
     ;
     begin:   display message  ; См. функцию 09Н
              terminate        ; Наше прерывание
     code     ends
              end start


     ВЫЗОВ ФУНКЦИИ (ПРЕРЫВАНИЕ 21Н)

     Вызов:         АН - номер функции
                    Другие регистры - в соответствии с
                    конкретной функцией
     Возвращает:    --

     Комментарий:
     В  соответствии  с  конкретной  функцией.  Прерывание 21Н
заставляет систему выполнять функцию, номер которой в АН.
     См. раздел 1.12 .

     Пример:
     Вызов функции  Получить-время

     mov      ah,2CH  ; 21Н - номер функции Получить-время
     int      21H     ; Вызов функции

     ЗАКОНЧИТЬ С АДРЕСОМ ВЫХОДА (ПРЕРЫВАНИЕ 22)

     Это  прерывание   может   организовать   только   MS-DOS.
Программа  пользователя  не  должна  этого  делать.  Если  вам

                             - 25 -


необходимо   написать   свою   программу   обработки    такого
прерывания,   используйте   функцию   35Н(   Получить   вектор
прерывания), сохраните полученный адрес стандартной  процедуры
и,  используя  функцию  25Н(  Установить  вектор прерывания ),
вставьте в соответствующее место таблицы векторов адрес  своей
процедуры обработки прерывания.
     По  прерыванию 22Н, MS-DOS передает управление программе,
начинающейся с адреса, указанного в  "клетке"  прерывания  22Н
таблицы  векторов.  При создании программного сегмента система
заносит этот адрес в префикс сегмента со смещением 0АН.

     ПРЕРВАТЬ ПО CONTROL+C (ПРЕРЫВАНИЕ 23H)

     При   нажатии   CONTROL+C   или   CONTROL+BREAK   ( на
IBM-совместимых  машинах)  MS-DOS  сразу  передает  управление
процедуре, начинающейся по адресу прерывания 23Н, указанного в
таблице векторов. При создании программного сегмента (сегмента
кодов)  система  заносит  этот  адрес  в  префикс  сегмента со
смещением 0ЕН.
     Это  прерывание   может   организовать   только   MS-DOS.
Программа  пользователя  не  должна  этого  делать.  Если  вам
необходимо написать свою  программу  обработки  прерывания  по
CONTROL+C,    используйте   функцию   35Н  ( Получить   вектор
прерывания), сохраните полученный адрес стандартной  процедуры
и,  пользуясь  функцией  25Н ( Установить  вектор прерывания),
вставьте адрес вашей  процедуры  на  место  прерывания  23Н  в
таблице векторов.
     Если  процедура  CONTROL+C сохраняет все регистры, то она
может вернуться в исходную программу  по  команде  IRET.  Если
написанная   пользователем   процедура   обработки  прерывания
возвращается по дальнему переходу, программа  использует  флаг
переноса  для  решения  прекращать  ли  программу.  Если  флаг
переноса установлен - прекратить, в противном случае программа
будет продолжена по IRET.
     Если   написанная   пользователем   процедура   обработки
прерывания по  CONTROL+BREAK  прерывает  функции  09Н,0АН  или
ввод/вывод через буфер, а затем возвращает управление по IRET,
то ввод/вывод продолжается с начала строки. MS-DOS всегда вы-
водит на экран CONTROL+C на зкран при прерывании 23Н. Вы никак
не сможете отменить этого.
     Нет никаких ограничений на действия процедуры  прерывания
по  CONTROL+C  -  включая вызов функций MS-DOS - учитывая то ,
что программа восстанавливает регистры.
     Если прерывается функция 09Н или 0АН(  Отобразить  строку
или  Ввод  с  клавиатуры  через буфер), то на экран посылается
3-байтовая строка 03Н-0DH-0AH( обычно С и перевод  строки),  а
вывод на экран продолжается с новой строки.
     Предположим   ваша   программа  использует  функцию  4ВН
(Загрузить и выполнить программу или  наложить)  для  создания
еще  одного  PSP и выполнения второй программы, которая в свою
очередь изменяет  адрес  прерывания  по  CONTROL+C  в  таблице
векторов.  MS-DOS  восстанавливает  начальное  значение  этого
вектора перед возвратом в исходную программу.

     ПРЕРВАТЬ ПО КРИТИЧЕСКОЙ ОШИБКЕ (ПРЕРЫВАНИЕ 24Н)

     При возникновении критической ошибки  в  ходе  выполнения
функций  ввода/вывода  (обычно это непоправимая ошибка диска),
MS-DOS передает управление  процедуре  прерывания  24Н,  адрес
которой находится в соответствующей "клетке" таблицы векторов.

                             - 26 -


При  создании  PSP  ,  система  заносит  в  него этот адрес со
смещением 12Н.
     Это прерывание может  быть  организовано  только  MS-DOS.
Пользовательская  программа  никогда  не  должна этого делать.
Если вам необходимо написать свою процедуру  обработки  такого
прерывания,   пользуйтесь   функцией   35Н  ( Получить  вектор
прерывания)     для     получения      адреса      стандартной
процедуры,  сохраните  этот  адрес,  а затем с помощью функции
25Н ( Установить  вектор  прерывания)  вставьте  адрес   своей
процедуры в соответствующее место таблицы векторов.
     MS-DOS  не  вызывает  прерывание  24Н  во время сбоев при
прерывании 25Н (Читать диск абсолютно) или  26Н  (Записать  на
диск   абсолютно).   Такие   ошибки  обслуживает  command.com.
Содержащаяся в нем  процедура  сначала  повторяет  операцию  с
диском,  затем  дает  возможность  выбрать  вариант дальнейших
действий: выйти, повторить, снять или игнорировать ошибку.
     Ниже   дано   описание   порядка   работы  с  процедурой
прерывания 24Н, включая использование кодов  ошибок, регистров
и стэка.

     1.11.1 Ограничения

     После пяти неудавшихся попыток ввода/вывода система  дает
прерывание  24Н,  если  не  задействованы  Таблица  размещения
файлов или сектор каталога. В этих случаях система делает  три
попытки.  Процедура обработки прерывания получает управление и
не может быть прервана. AX  и  DI  содержат  коды  ошибок,  ВР
содержит смещение ( сегментный адрес в SI ) управляющего блока
заголовка устройства , на котором произошел сбой.

     1.11.2 Требования к процедуре прерывания 24Н

     Для   вывода пользователю  запроса   "Выйти,   Повторить,
Снять или   Игнорировать",   написанная   вами    программа
обработки  прерывания  по  критической  ошибке должна в первую
очередь поместить в стэк регистр флагов и  пердать  управление
стандартной  процедуре прерывания по CALL FAR. После того, как
пользователь ответит на запрос, MS-DOS  возвращает  управление
написанной  вами  процедуре.  Кроме  того,  перед продолжением
своей работы она должна сохранить BX,CX,DX,DS,ES,SS и SP. Ваша
процедура     может      использовать      только      функции
01Н-0СН (включительно) и 59Н ( в противном случае она разрушит
стэк   системы   и   оставит  ее  в  неустойчивом  состоянии).
Содержимое Заголовка устройства не должно изменяться.
     Рекомендуется прикладным  программам  проводить  тест  по
расширенному  коду  ошибок  по возвращении из прерывания 24Н.

     Пользовательский стэк

     При использовании,  пользовательский стэк
     будет выглядеть следующим образом ( начиная с вершины
     стэка) :


     IP  Регистры MS-DOS после прерывания 24Н
     CS
     FLAGS

     AX  Регистры пользователя
         на момент обращения к функции MS-DOS по INT 21H

                             - 27 -


     BX
     CX
     DX
     SI
     DI
     BP
     DS
     ES

     IP   Регистры после прерывания 21Н
     CS
     FLAGS

     Если   написанная   пользователем   программа   обработки
прерывания  по  критической  ошибке  возвращается  по IRET, то
реакция MS-DOS будет зависеть от содержимого AL:

     AL             Выполняемое  действие
     _________________________________________________________
     0              Игнорировать ошибку
     1              Повторить операцию
     2              Выйти из программы по INT 23Н
     3              Снять текущий  системный вызов

     Помните,  что  игнорирование  ошибки  может  привести   к
непредсказуемым результатам, т.к. система будет вести себя, как
если бы операция была завершена успешно.

     Коды ошибок диска, передаваемые в АХ

     Если  бит  7  регистра АН равен 0, то ошибка произошла на
дисководе. AL содержит  номер  этого  дисковода  (0=А,  1=В  и
т.д.).  Бит  0 регистра АН указывает, была ли ошибка по чтению,
или она произошла во время записи (0=чтение, 1=запись), а биты
1 и 2 указывают на область диска, где произошел сбой:

     Биты 1 и 2     Место ошибки
     _________________________________________________________
     00             Системная(MS-DOS) область
     01             Таблица размещения файла (FAT)
     10             Каталог
     11             Область данных
     _________________________________________________________

     Биты 3 и 5 регистра АН указывают на разрешенный ответ  со
стороны пользователя на запрос системы.

     Бит  Значение  Ответ
     _________________________________________________________
     3    0         Снять не разрешено
          1         Снять разрешено
     4    0         Повторить не разрешено
          1         Повторить разрешено
     5    0         Игнорировать не разрешено
          1         Игнорировать разрешено
     ________________________________________________________

     Если вы укажите повторить, а это не разрешено, то система
изменяет  ваш  ответ на Снять. Если вы укажите Игнорировать, а
это не разрешено, то система заменит ответ на Снять.  Если  вы

                             - 28 -


укажите  Снять,  а  это  не  разрешено,  то  результатом будет
Прервать. Ответ Прервать всегда разрешен.

     Коды ошибок других устройств, передаваемые в АХ

     Если бит 7 регистра АН равен 1, то либо нарушена  Таблица
размещения   файлов,   либо  ошибка  произошла  на  устройстве
символьной   обработки.   Заголовок   устройства,   адресуемый
регистрами  BP:SI,  содержит  поле  Слово атрибута. Биты этого
поля идентифицируют тип устройства и тип ошибки.
     Поле  Слово  атрибута  имеет  смещение  04Н  в  Заголовке
устройства.  Бит  15  определяет  тип  устройства (0=блоковое,
1=символьное).
     Если бит 15 равен  нулю (устройство  блоковой  передачи,
например дисковод), то  ошибка в   Таблице    размещения
файлов (FAT).
     Если  бит  15 равен 1 (символьное устройство), то ошибка
произошла  на  устройстве  символьной  обработки.  Регистр  DI
содержит  код  ошибки,  значение  AL не определено, а биты 0-3
Слова атрибута имеют следующий смысл:

     Бит            Значение при установке
     _________________________________________________________
     0              Текущий стандартный ввод
     1              Текущий стандартный вывод
     2              Текущее неразрешенное  устройство
     3              Текущее синхронное устройство ( принтер)
     _________________________________________________________

     Подробное   описание   управляющего    блока    Заголовка
устройства см. в Главе 2, "Драйверы устройств MS-DOS".

     Коды ошибок в регистре DI

     Старшее  полуслово  DI  не определено. Младший байт может
содержать следующие коды:

     Код            Описание
     __________________________________________________________
     0              Попытка записать на диск,
                    защищенный по записи
     1              Неизвестное устройство
     2              Дисковод не готов
     3              Неизвестная команда
     4              Ошибка циклического кода проверки
     5              Неправильная структура запроса
     6              Ошибка поиска
     7              Неизвестный тип диска
     8              Сектор не найден
     9              Нет бумаги в принтере
     А              Ошибка записи
     В              Ошибка чтения
     С              Общий сбой
     __________________________________________________________
     Написанная пользователем процедура  обработки  прерывания
24Н  может  использовать  функцию  59Н  (Получить расширенный
код  ошибки)  для получения детальной  информации  об  ошибке,
вызвавшей это прерывание.


© KOAP Open Portal 2000



Яндекс цитирования