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