Глава 4. Основы организации ДОС
ГЛАВА 4. ОСНОВЫ ОРГАНИЗАЦИИ ДОС
В этой главе будет кратко рассмотрена система ДОС, основная операционная система IBM/PC. Мы не будем слишком подробно рассматривать ее, частично потому что ДОС может составить достаточный предмет для нескольких книг сама по себе, а частично потому, что эта книга в основном посвящена внутренней организации IBM/PC, а не организации ДОС. Но все же, поскольку ДОС очень широко используется на IBM/PC, необходимо иметь определенные представления об ее организации. Так как основное внимание в этой книге уделяется наиболее сложным возможностям IBM/PC, мы покажем как осуществляется доступ к этим возможностям с помощью средств операционной системы ДОС. Здесь тесно соприкасаются все три упоминавшиеся выше области интересов. Практически все, о чем пойдет речь в данной главе, относится к IBM/PC, совместимым с ней компьютерам, а также к компьютерам, работающим под управлением МS-DOS. 4.1. Для чего нужны операционные системы? Чтобы полнлстью овладеть всеми возможностями своего компьютера, необходимо понимать его операционную систему. Предлагаемый в этой главе краткий обзор позволит Вам понять, что собой представляет ДОС. Слишком подробных знаний Вы не приобретете, но ознакомление с этой главой позволит Вам начать с ней работать. Назначение операционной системы заключается в обеспечении удобства управления компьютером. Операционная система, в полном смысле этого термина, является первой и наиболее важной программой любого компьютера. Как правило, она является и наиболее сложной. Паразительно, что наиболее совершенные программы используются только для управления самим компьютером. Ирония здесь заключается в том, что компьютеры и программы для них разрабатывались для выполнения полезной работы, а не как самоцель. Но с другой стороны, наиболее мощный инструмент, созданный человеком, компьютер, имеет достаточно возможностей, чтобы работать сам по себе и человек не смог бы управлять им, если бы не операционная система. Большая часть работы операционной системы заключается в том, чтобы скрыть от пользователей некоторые сложные и ненужные им детали. В качестве иллюстрации рассмотрим работу команды COPY в ДОС. Предположим, что мы используем ее для копирования с одной дискеты на другую. Вам может показаться, что это не очень сложная процедура. Рассмотрим, однако, лишь некоторые действия, которые должна выполнить операционная система: - Проверить, имеется ли на исходной дискете файл с указанным именем. - Проверить, должно ли копирование выполняться не в файл на дискете, а на какое-нибудь устройство (например, на устройство печати). - Проверить, нет ли файла с таким именем на целевой дискете. - Проверить, достаточно ли места на целевой дискете для размещения файла (учитывая все свободное место на дискете, а, если копия файла уже есть на дискете, то еще и место, которое она занимает). - Если на целевой дискете должен создаваться новый файл, то необходимо проверить, имеется ли свободное место в справочнике или он уже заполнен. - Установить формат исходной дискеты: односторонний или двухсторонний? - Установить формат целевой дискеты: односторонний или двухсторонний? - Проверить, не копируется ли файл сам в себя (что запрещено). - Проверить наличие в системе двух дисководов, поскольку для систем с одним дисководом необходимо имитировать диск В. - Проверить, необходимо ли вычислять размер исходного файла по его размеру, указанному в справочнике, или он будет определяться маркером конца файла (как для текстовых файлов в коде ASCII). - Проверить, находится ли таблица размещения файлов для исходной дискеты в оперативной памяти. - Проверить, находится ли таблица размещения файлов для целевой дискеты в оперативной памяти. - Проверить корректность размещения исходного файла на дискете по соответствующей таблице размещения файлов. - Проверить, совпадает ли размер файла, указаный в справочнике, с действительным размером. - Установить, какой обьем памяти можно использовать в качестве буфера при перезаписи файла. - Проверить, больше или меньше 64К размер буфера. - Нужно ли удалять из памяти интерпретатор команд, чтобы увеличить размер буфера? Вы еще не устали от этого перечисления? А ведь это еще только начало! Пока что рассмотрен только логический уровень задачи. Ниже приводится физический уровень, причем при его изменении опущено значительно больше подробностей: - Запущен ли двигатель дисковода? - Выведена ли головка чтения/записи на нужную дорожку? - Сколько секторов данных нужно считать/записать на этой дорожке? - Готов ли дисковод к выполнению команды? - Работает ли дискета? Не требуется ли перезапуск, повторная попытка выполнения операции или повторное позиционирование головки? - Если уже выполнялась повторная попытка, достаточно ли было сделано попыток, чтобы выдать запрос о дальнейших действиях? - Каким был ответ на запрос? Повторить, игнорировать или аварийно завершить работу? - Ожидание готовности дисковода? - Операция чтения/записи/поиска завершилась успешно? - Целевая дискета защищена от записи? Все описанное выше является лишь приблизительным перечислением подробностей операции копирования файла. А это еще относительно простая операция ДОС. Кстати, приведенное разделение на логический и физический уровни очень важно для работы операционной системы. Основная забота операционной системы, такой как ДОС, заключается в том , чтобы скрыть от пользователя эти ненужные ему подробности. Значительная часть функций операционной системы заключается в обслуживании устройств ввода/вывода. Помимо физического уровня обслуживания ДОС обеспечивает и услуги более высокого уровня, такие как поиск в справочниках, копирование файлов и загрузку программ. Один из путей достижения эффективности операционных систем - это модульность их разработки. Операционная система упрощается и становится более эффективной, если ее разработчики разделят все ее функции на отдельные части. Затем эти части должны быть организованы в тщательно спланированную иерархическую систему, в которой каждый уровень иерархии выполняет присущие ему функции, освобождая уровни, находящиеся выше по иерархии, от их выполнения (и, в свою очередь, не занимаясь деталями функций, присущих нижним уровням). Теперь мы перейдем к рассмотрению отдельных частей ДОС. 4.2. Шесть основных модулей ДОС Всю систему можно разделить на шесть основных частей, функции каждой мз которых мы кратко рассмотрим в этом разделе. Первая часть - это система BIOS в ПЗУ. Это система поставляется вместе с IBM/PC и может использоваться любой операционной системой. Функция BIOS в ПЗУ заключается в обслуживании основных и наиболее фундаментальных операций компьютера. Поскольку система BIOS в ПЗУ для IBM/PC является "встроенной" в комптютер, она является не только составной частью ДОС, но и составной частью любой операционной системы IBM/PС. Еще одна часть - "загрузочная запись" дискеты. Загрузочная запись - это очень короткая и простая программа, находящаяся в первом секторе каждой дискеты. Функция этой программы заключается в запуске процесса загрузки операционной системы после включения компьютера или перезапуска (нажатия клавиш CTRL-Alt-Del). Загрузочная запись считывает еще два модуля операционной системы в память и они завершают процесс загрузки ДОС. Следующие две части ДОС представляют собой дисковые файлы IBMBIO.COM и IBMDOS.COM. Обе эти части загружаются в память загрузочной записью и остаются в памяти во время работы ДОС, так что провести между ними различие довольно трудно. Файл IBMBIO.COM представляет собой изменяемое дополнение к системе BIOS в ПЗУ. Начиная с версии 2.00 файл IBMBIO.COM может дополняться другими частями, называемыми независимыми драйверами устройств, которые мы подробнее рассмотрим несколько позже. Система BIOS в ПЗУ, IBMBIO.COM и драйверы устройств, вместе взятые образуют "физический" уровень операционной системы. Файл IBMDOS.COM реализует основные услуги ДОС. Это "логический" уровень ввода/вывода операционной системы. Оба эти файла являются "скрытыми" системными файлами (о которых подробнее будет сказано в главе 5). Имена этих файлов не включаются в оглавление диска, вызываемое по команде DIR. Команда CHKDSK (для ДОС версии 1.10 и последующих) укажет, что эти файлы находятся на дискете, но не сообщит их имена. Если Вы воспользуетесь процедурой DiskLook для просмотра содержимого дискеты, то оба имени, IBMBIO.COM и IBMDOS.COM, будут присутствовать в списке и их можно просматривать так же, как все остальные файлы. Одна из функций IBMBIO.COM заключается в загрузке еще одного модуля операционой системы. Пятая часть - это дисковый файл COMMAND.COM. Главная функция COMMAND.COM заключается в обработке команд, вводимых пользователем. Команды ДОС, считающиеся внутренними, такие как TYPE, COPY и DIR фактически реализуются программами COMMAND.COM. Собственно COMMAND.COM разделяется на две части: одна становится частью IBMDOS.COM, а вторая - процессором дополнительных команд. Более подробно об этом сказано в разделе 4.7. Шестая и последняя часть ДОС состоит из всех внешних команд, таких как FORMAT и DISKCOPY. Функции этих команд различны и реализующие их программы загружаются в память только в случае необходимости. В отличие от остальных пяти частей ДОС, все эти дополнительнве программы не являются интегральной составляющей ДОС, хотя они и поставляются вместе с ней. Некоторые из этих дополнительных программ, например, FORMAT, настолько важны, что обойтись без них практически невозможно. Внешние команды являются нерезидентными частями ДОС, поскольку они не находятся в памяти постоянно. Файлы IBMBIO.COM, IBMDOS.COM и драйверы устойств находятся в памяти постоянно и образуют резидентную часть ДОС. Файл COMMAND.COM можно выделить в отдельную категорию как полу-резидентную составляющую ДОС, о чем речь пойдет ниже. Загрузочная запись используется только временно и поэтому не является резидентной частью ДОС. В следующих шести разделах мы более подробно рассмотрим каждую из частей ДОС. 4.3. Система BIOS в ПЗУ Первая часть в ДОС - это BIOS в ПЗУ или базовая система ввода/вывода, размещающаяся в постоянной памяти. Эта система обеспечивает наиболее простые и универсальные услуги операционной системы, связанные с осуществлением ввода/вывода. Система BIOS располагается в ПЗУ начиная с адреса FE00 и до FFFF, сразу же после интепретатора БЕЙСИКа. Распределение памяти, приведенное в главе 3, показывает и размещение системы BIOS. Поскольку BIOS в ПЗУ является частью IBM/PC, она может изменяться только в том случае, когда изменениям подвергается аппаратная реализация системы. В качестве составной части IBM/PC, система BIOS в ПЗУ является не просто одной из частей ДОС, но частью любой операционной системы IBM/PC. Система BIOS в ПЗУ состоит из нескольких частей, большинство из которых представляет собой программы (остальные - это важные таблицы данных, которые мы рассмотрим в последующих главах). Программа системы BIOS, которая выполняется первой, представляет собой тест функциониования. Эта программа поверяет память и внешние устройства, подключенные к IBM/PC, как только будет включено питание компьютера. Работа этой программы определяет ту задержку, которая имеет место между включением питания и загрузкой операционной системы. Чем больший объем памяти подключен к Вашему компьютеру, тем дольше выполняется тест, поскольку наиболее длительной процедурой является процедура поверки памяти. Следующая часть BIOS, которая должна выполняться как программа запуска операционной системы, - это программа вызова загрузчика операционной системы. Эта программа проверяет, подключен ли дисковод с гибкими дисками и считывает с дискеты "загрузочную запись". После считывания загрузочной записи программа запуска передает ей управление, чтобы она считала оставшиеся части операционной системы. Если в системе нет дисковода или при считывании загрузочной записи произошла ошибка, то программа запуска BIOS передает управление кассетной системе БЕЙСИК. Если Вы включите IBM/PC, не установив дискету в дисковод, то Вы увидите, что начала работу программа кассетной системы БЕЙСИКа. Помимо двух уже описанных частей - автономного теста функцонирования и программы запуска, система BIOS в ПЗУ содержит множество других программ и они-то представляют для нас наибольший интерес. Сюда входят программы обслуживания всего стандартного периферийного оборудования IBM/PC. Эти программы выполняют основные функции управления клавиатурой, дисплеем, дискетами, асинхронным адаптером связи, устройством печати и кассетным интерфейсом. Работой с этими программами нам необходимо овладеть, чтобы полностью использовать все возможности IBM/PC. Подробно мы рассмотрим их в главах с 6 по 11. 4.4. Начальная загрузка - загрузочная запись Загрузочная запись необходима для запуска ДОС. Принцип использования загрузочной записи реализован практически на всех компьютерах. Загрузочная запись содержит минимум необходимых команд для считывания и запуска основных частей операционной системы. При запуске IBM/PC либо включением питания, либо нажатием клавиш Ctrl-Alt-Del, процедура запуска системы BIOS в ПЗУ считывает первую запись дискеты, установленной в дисковод А и помещает ее в стандартную область памяти, по адресу 31744 или 7С00 (шестнадцатиричное). После считывания загрузочной записи BIOS передает ей управление, выполняя переход по адресу 31744. Далее загрузочная запись должна продолжить загрузку операционной системы. Основное назначение загрузочной записи для ДОС заключается просто в загрузке файлов IBMBIO.COM и IBMDOS.COM. Загрузочная запись имет размер стандартного сектора на дискете, 512 байт, что недостаточно для сложной программы. Для упрощения работы этой программы, оба файла, IBMBIO.COM и IBMDOS.COM, размещаются в определенных постоянных местах на дискете. Это избавляет программу загрузки от необходимости искать их в справочнике дискеты. Этим, кстати, "системная" дискета отличается от обычной - на ней, в определенных местах, находятся два системных файла IBMDOS.COM и IBMBIO.COM. Поэтому нельзя просто преобразовать обычную дискету в системную - места, зарезервированные для системных файлов, могут быть заняты другими файлами. Хотя загрузочная программа не столь совершенна, чтобы осуществлять поиск системных файлов, она все же способна проверить правильность их включения в справочник. Поскольку оба системных файла включены в справочник дискеты, они защищены как от стирания, так и от любых других способов доступа установлением атрибутов скрытого и системного файла. (В следующей главе мы поясним, что такое скрытые и системные файлы). В связи с простотой ее задачи, программа загрузки является относительно стабильной составной частью ДОС. Ее потребовалось изменить, когда изменялся размер или местоположение системных файлов, а это произошло с введением поддержки двухсторонних дискет в версии ДОС 1.10. Вы можете обнаружить различия в загрузочных записях ДОС различных версий. (Загрузочную запись легко просмотреть с помощью моей утилиты DiskLook: запустите DiskLook, нажмите клавишу F7 и введите адрес загрузочной записи на дискете: сторона 0, дорожка 00 и сектор 1, после чего нажмите клавишу F6 - на экране будет отображена загрузочная запись). Загрузочная запись ДОС версии 1.00 имеет одно незначительное отличие от всех остальных версий, которое легко заметить.Вместо имени Роберта О'Рира в исходной версии ДОС, во всех последующих версиях указывается название фирмы "Майкрософт". 4.5. Дополнительные операции с устройствами: IBMBIO.COM Первый из двух системных файлов, IBMBIO.COM, предназначен для дополнения функций системы BIOS в ПЗУ. Как BIOS в ПЗУ, так и IBMBIO.COM занимаются обслуживанием операций ввода/вывода или обслуживанием устройств, что то же самое. Такая функция предполагает обработку различных подробностей, связанных с функционированием устройств ввода/вывода. Сюда же включается обнаружение ошибок и их исправление, что для программ еще сложнее. Программы IBMBIO.COM отличаются тем, что их легко можно изменить, чего нельзя сказать о программах BIOS в ПЗУ. Файл IBMBIO.COM предназначен для решения трех задач, которые невозможно решить с помощью системы BIOS в ПЗУ. Первая задача заключается в настройке на нужды конкретной операционной системы, ДОС. Любая операционная система, включая СР/М-86 и р-систему Калифорнийского университета в Сан-Диего, может использовать универсальную систему BIOS в ПЗУ, но в той части, в которой системы различаются, они должны реализовывать собственные фрагменты системы ввода/вывода. Вторая задача IBMBIO.COM заключается в исправлении любых ошибок в BIOS в ПЗУ, если в этом возникнет необходимость. Программы, подобные системе BIOS, проверяются очень тщательно, ведь их размещение в ПЗУ не допускает исправлений. Если ошибки все же будут позднее обнаружены в BIOS, их можно будет исправить путем внесения соответствующих изменений в IBMBIO.COM. Это делается путем изменения векторов прерываний таким образом, чтобы управление при обращении к операциям BIOS сначала попадало в IBMBIO.COM, а уже затем в BIOS. Соглашения о вызовах процедур системы BIOS в ПЗУ всегда предполагает использование прерываний, вместо прямых переходов по адресам ПЗУ. Основная причина использования прерываний как раз и состоит в обеспечении возможностей перехвата управления у процедур BIOS, ведь, в противном случае, такой возможности просто не существовало бы. В главе 7, когда будет рассматриваться программа управления дискетами, известная под названием "Disk base", Вы увидите одно из таких изменений, частично подменяющее функции системы BIOS в ПЗУ. Третья задача, которую не позволяет решить BIOS, и, которую за нее решает IBMBIO.COM, заключается в обслуживании новых периферийных устройств, таких как жесткие диски большой емкости, или восьмидюймовые (203мм) дискеты, или плоттеры, или любые из сотен устройств, которые могут быть подключены к IBM/PC. Когда новое устройство ввода/вывода подключается к IBM/PC, обслуживающая его программа должна включаться в файл IBMBIO.COM или его расширения, без необходимости замены микросхем ПЗУ, в которых размещается система BIOS. В наиболее ранних версиях ДОС задача включения нового устройства в систему предполагала внесение изменений в IBMBIO.COM и, возможно, в другие системные программы ДОС. Хотя это не слишком сложно для таких фирм как "ИБМ" или "Майкрософт", такая задача может оказаться непосильной для пользователя, которому требуется включить дополнительное оборудование в свою систему. Поскольку возможность добавления новых устройств к компьютеру составляет немаловажное условие его успеха на рынке, процедура включения обслуживающих программ в ДОС была упрощена, начиная с ДОС версии 2.00. Когда управление впервые после запуска системы передается IBMBIO.COM, он проверяет, находится ли на дискете файл конфигурации системы. Если файл конфигурации найден, считываются его команды, часть которых определяет ряд параметров системы. Команды файла конфигурации включают имена всех программ обслуживания устройств, которые необходимо включить в BIOS. Каждая из этих программ загружается в память как дополнение к IBMBIO.COM. Такая схема облегчает добавление новых устройств, позволяет делать это модульно, не затрагивая системные файлы ДОС. Как правило, любая программа, работающая на IBM/PC, будет использовать обычную версию BIOS для ДОС. Однако, в некоторых случаях программе необходимо бывает особое обслуживание операций ввода/вывода. Поскольку IBMBIO.COM представляет собой дисковый файл, который можно изменить, имеет смысл разработать версию IBMBIO.COM, настроенную на Ваши конкретные нужды. Пример такой настройки Вы можете найти в диагностических программах. 4.6. Основа ДОС: IBMDOS.COM Разделение операционной системы на два модуля, IBMBIO.COM и IBMDOS.COM позволяет разделить те части, которые специфичны для конкретного компьютера и те, которые являются общими для всех компьютеров, работающих под управлением ДОС. Служебные процедуры ДОС, в определенной степени произвольно, разделены на те, которые вызываются с помощью собственных прерываний, и те, которые разделяют общее прерывание (номер 33, шестнадцатиричное значение 21). В терминологии ДОС, первая группа называется прерываниями ДОС, а вторая - вызовами функций. В обоих случаях для их вызова используются программные прерывания, причем по той же причине, что и для вызова программ BIOS: для обеспечения модульности. Диапазон прерываний от 32 до 63 (шестнадцатиричные значения от 20 до 3F) зарезервированы для использования ДОС. Используется только часть этих прерываний, а остальные обеспечивают возможность дальнейшего расширения. Программы обслуживания прерываний ДОС включают чтение и запись секторов дискеты, доступ к контролю за ошибками ДОС и операциями клавиатуры Ctrl-Break. Вызовы функций ДОС обеспечивают, в основном, промежуточный уровень обслуживания операций ввода/вывода. В качестве примеров можно упомянуть ввод с клавиатуры, обычный вывод на экран дисплея, ввод/вывод по асинхронной линии связи и вывод на печать. Предусмотрены также логические операции для дискет - открытие и закрытие файлов, поиск в справочнике файлов, удаление и создание файлов, чтение и запись данных. Эти процедуры обеспечивают практически все элементарные операции, которые могут потребоваться программе для работы с файлами и данными, хранящимися в файле, так чтобы программе не приходилось самостоятельно расшифровывать данные справочников, таблиц размещения файлов и т.п. Большая часть этих служебных процедур ДОС интенсивно используется программами более высокого уровня ДОС. Например, процедура поиска в справочнике используется командами DIR и COPY. Кроме того, она используется интерпретатором команд для поиска программных файлов. В разделе 4.9 будет рассмотрен полный список служебных процедур ДОС. 4.7. Файл COMMAND.COM и внутренние команды Следующая составная часть ДОС, файл COMMAND.COM, одна из наиболее интересных частей, как с точки зрения тех услуг, которые она предоставляет пользователю, так и с точки зрения принципов ее функционирования. COMMAND.COM имеет несколько функций. Прежде всего, это "процессор команд", что означает возложенные на него функции ввода команды, набираемой на клавиатуре, и определения дальнейших действий. Когда вводится внутренняя команда, такая как DIR, COPY, TYPE, REM или PAUSE, то запрашивается случайная процедура, "встроенная" в COMMAND.COM, так что она может выполняться немедленно. Чтобы распознавать внутренние команды, COMMAND.COM содержит таблицу имен команд. Если просмотреть файл COMMAND.COM, то можно увидеть эти имена команд. Для просмотра файла COMMAND.COM можно воспользоваться программой DEBUG или DiskLook. Там же Вы увидите сообщение, которое ДОС выдает в начале работы. При желании эти сообщения можно изменить с помощью команды DEBUG или SecMod, так чтобы ДОС начинала работу выдачей Вашей фамилии или названия компании. Можно также изменить и имена внутренних команд, причем сделать это просто, если не изменяется длина имени. Если команды нет в таблице внутренних команд, значит имеется в виду внешняя команда, которую COMMAND.COM будет искать во внешнем файле. В ответ на наш запрос, COMMAND.COM осуществляет поиск файла обработки команды на соответствующей дискете и запускает его выполнение. Существует три типа файлов обработки команд, поиск которых в определенном порядке осуществляет COMMAND.COM. Название команды точно совпадает с именем файла, в котором хранится програма обработки команды. Три типа файлов обработки команд различаются расширениями имен файлов. Три расширения, в порядке их приоритетности: ".COM", которое обозначает программный файл в одном из двух программных форматов; ".EXE", обозначающее программный файл другого формата и ".BAT", обозначающее файл пакетной обработки. (Форматы этих файлов и масса другой информации, касающейся файлов на дискетах, приведены в следующей главе.) Когда COMMAND.COM находит программный файл в любом формате, он выполняет загрузку этого файла в память и выполняет любое необходимое преобразование. После загрузки файла и формирования приставки программного сегмента, COMMAND.COM передает управление этой программе, так чтобы она могла выполнить свою работу. Если файл обработки команды относится к типу ".BAT", то есть является файлом пакетной обработки, то он содержит в формате текстового файла в коде ASCII последовательность команд, которые должны выполняться так, как будто они вводятся с клавиатуры. Одна из многих задач COMMAND.COM заключается в отслеживании позиции в файле пакетной обработки, так чтобы после выполнения одной команды сразу переходить к другой. Если в процессе обработки одного пакетного файла будет вызван другой, то возврата к первому не произойдет, так как файлы пакетной обработки не могут быть вложенными, зато их можно объединять в цепочку. В некоторых системах весь ввод команд может быть переназначен на файл, причем это относится как к программам, вводящим данные с клавиатуры, так и к интерпретатору команд. К ДОС это не относится. Только интерпретатор команд COMMAND.COM может автоматически выполнять чтение из файлов пакетной обработки. Кстати, программы могут вносить изменения в файл пакетной обработки и таким образом определять, какая команда будет выполнена следующей. Это часто делается в сложных приложениях для замены последовательного выполнения программ. Файл COMMAND.COM имеет значительно больше функций, чем было описано. Фактически, COMMAND.COM разделяется на три части. Первая часть размещается в памяти сразу после програм IBMBIO.COM и IBMDOS.COM и, подобно им, становится резидентной частью ДОС. Фактически эта часть COMMAND.COM не отличается от IBMDOS.COM. Вторая часть COMMAND.COM используется только временно: при запуске системы она осуществляет поиск файла пакетной обработки AUTOEXEC.BAT и, если он найден, его выполнение. После выполнения этой функции данная часть COMMAND.COM уже не нужна. Третья, наиболее интересная часть COMMAND.COM является полурезидентной и одной из наиболее хорошо проработанных частей ДОС. Эта часть включает интерпретатор команд и программы, реализующие внутренние команды ДОС. Необходимо отдавать себе отчет в том, что такая сложная программа как интерпретатор команд не может быть очень компактной. С одной стороны, лучше всего было бы, чтобы интерпретатор команд постоянно находился в памяти. С другой стороны, не хотелось бы, чтобы он занимал место в памяти все время, особенно, если места не слишком много (в системах с 64К, например). Интересное решение этой проблемы заключается в том, чтобы разместить эту часть COMMAND.COM в верхних адресах памяти (обычно используются последние адреса) и позволить другим программам затирать эту область памяти. Когда снова возникает необходимость использования интерпретатора команд, резидентная часть СOMMAND.COM сначала проверяет находится ли интерпретатор команд в памяти. Если он запорчен другими программами, то резидентная часть перезагружает его с дискеты. (По этой причине, кстати, необходимо иметь копии COMMAND.COM на всех Ваших дискетах, даже на тех, которые не форматировались в системном формате. Если в процессе работы Вы увидите сообщение:"Insert DOS disk..." [вставьте диск ДОС], это будет означать, что на используемой Вами дискете отсутствует файл СOMMAND.COM). Чтобы проверить наличие в памяти интерпретатора команд, вычисляется контрольная сумма тех ячеек памяти, в которых он должен находиться. Если сумма не совпадает с ожидаемой, то COMMAND.COM перезагружается. Вычисление контрольной суммы может производиться при перезагрузке COMMAND.COM и, если обнаружено различие, ДОС выдает сообщение об ошибке. Это происходит даже в том случае, когда различие заключается всего лишь в том, что Вы изменили начальное сообщение ДОС ("The IBM Personal Computer DOS"..), которое, как я уже упоминал, можно изменить. Если Вы это сделали или внесли какие-нибудь другие изменения в COMMAND.COM, это необходимо сделать на всех Ваших дискетах. Одна из причин, по которой COMMAND.COM оформляется в виде отдельного файла и не объединяется с двумя другими системными файлами, заключается в облегчении разработки прикладных версий. Это одна из основных возможностей адаптации IBM/PC к нуждам пользователей. Если необходимо часть пользовательских команд сделать внутренними или изменить способ работы интерпретатора команд, то можно написать специальную программу COMMAND.COM. Примером прикладной версии COMMAND.COM может служить исходная версия 1.00 текстового процессора Easy-Writer. Он имеет собственный вариант COMMAND.COM и поэтому переход от ДОС к Easy-Writer и наоборот требует перезагрузки системы. Как рекомендует руководство фирмы "ИБМ", операционная система может быть перезагружена после нажатия клавиш Ctrl-Alt-Del. Это приводит к полному перезапуску системы, начиная с чтения загрузочной записи. Имеется, однако, менее радикальный способ перезапуска. Если ввести команду COMMAND, то перезагрузится только COMMAND.COM и система перезапустится без перезагрузки IBMBIO.COM и IBMDOS.COM. Это позволяет обновить версию интерпретатора команд и выполнить файл пакетной обработки AUTOEXEC.BAT. 4.8. Оставшиеся части ДОС: внешние команды Последнюю часть операционной системы ДОС составляют внешние команды. Они называются внешними, поскольку они не включены в состав ДОС, и не являются резидентными в памяти IBM/PC. Вместо этого, внешние команды хранятся в программных файлах на дискетах. Как все программные файлы, все внешние команды имеют расширение имени файла ".COM" или ".EXE", что указывает, в каком из форматов они оформлены. Мы рассмотрим эти форматы, когда будем рассматривать структуру дискет и файлов в следующей главе. Примерами внешних команд могут служить DISKCOPY, COMP, FORMAT, а такие программы как EDLIN, BASIC или BASICA тоже в определенном смысле являются внешними командами, хотя их лучше все же считать языковыми процессорами, такими как макроассемблер или Паскаль. Внешние команды не отличаются от других программных файлов, которые Вы сами разрабатываете или покупаете. С одной точки зрения внешние команды действительно являются частью операционной системы, особенно те, без которых операционной системой нельзя воспользоваться, такие как FORMAT. Однако, с другой точки зрения, внешние команды - это всего лишь вспомогательные программы, утилиты, которые полезны, но которые не являются операционной системой. Разница между внешней командой ДОС и обычной программой заключается просто в Вашем отношении к ней - как к части ДОС или как к чему-нибудь малосущественному. 4.9. Доступ к средствам и услугам ДОС В это разделе мы рассмотрим все служебные процедуры, доступные пользователям ДОС. Здесь будет приведен первый из нескольких списков служебных процедур, которые встречаются в этой книге. Данный раздел описывает средства ДОС, а последующие главы будут последовательно описывать служебные процедуры, обеспечиваемые системой BIOS в ПЗУ. Прежде чем перейти к подробному рассмотрению этих средств, определим способ изложения, который мы будем использовать в дальнейшем. Мы будем последовательно описывать эти средства, указывая их идентифицирующие номера и описывая, что каждое из средств делает. Мы не будем рассматривать во всех подробностях способы вызова служебных процедур, поскольку это не представляет большого интереса. Еще одна причина, по которой не описываются способы вызова служебных процедур ДОС, заключается в том, что читателям этой книги предлагается набор интерфейсных программ, которые избавят Вас от утомительных процедур загрузки регистров и установки флагов. В тех случаях, когда нужно будет сделать отступление, чтобы сообщить нечто интересное о конкретной процедуре, ее назначении или связи с другими частями IBM/PC, мы будем делать паузу и излагать этот материал. Даже если Вы не собираетесь писать программы, которые будут использовать эти процедуры, Вам все равно полезно будет прочитать этот раздел. Он поможет Вам больше узнать о том, как IBM/PС работает, какими возможностями обладает и как заставить ее выполнять некоторые удивительные задания. Если Вы пишите программы для IBM/PC, Вам просто необходимо овладеть всеми средствами доступа к служебным процедурам. Чтобы как можно больше облегчить использование этих процедур, я написал полный набор интерфейсных программ, который записан на дискетах, прилагаемых к этой книге. Все служебные процедуры ДОС и BIOS в ПЗУ приспособлены для их вызова из программ на языке ассемблера. Для каждой из этих процедур я написал на ассемблере специальную интерфейсную программу, которая обеспечивает доступ к процедуре из программ, написанных на Паскале и других языках высокого уровня. Ассемблерные интерфейсные программы для процедур ДОС, описанных в этом разделе, приведены в листинге 4.101. Во многих случаях очень полезно иметь более гибкое средство, чем просто интерфейсная программа. Не менее полезной может оказаться и какая-нибудь вспомогательная программа. Для этой цели мною включены в пакет многочисленные программы, написанные на Паскале, которые позволяют наиболее полно использовать вызываемые служебные процедуры. Для средств ДОС, описанных в этом разделе, вспомогательные программы на Паскале приведены в листинге 4.102. Интерфейсные программы на ассемблере и вспомогательные программы на Паскале позволят Вашим программам получить наиболее полный доступ ко всем возможностям IBM/PC. В ДОС используется семь процедур обслуживания прерываний и еще одна, восьмая, предназначенная для вызова всех функций ДОС. Сначала рассмотрим отдельные процедуры. Прерывание 32 (шестнадцатиричное значение 20) используется для завершения работы программы. Это нормальный способ завершения работы программы и запроса к ДОС на выполнение необходимых восстановительных операций. Эти восстановительные операции имеют два аспекта. Во-первых, имеются три служебных прерывания, которые программе разрешается изменять для собственных целей, а после завершения программы ДОС восстанавливает те значения, которые вектора этих прерываний имеют по умолчанию. (См. разделы посвященные прерываниям с номерами 34, 35 и 36.) Во-вторых, если программа изменила какие-либо данные, хранящиеся на дискете, может оказаться, что часть данных осталась в системных буферах и ДОС записывает эти данные на дискету. Однако, ДОС не закрывает открытые файлы и программа должна сделать это сама, до обращения к прерыванию 32. Прерывание 33 (шестнадцатиричное значение 21) используется для вызова функций, которые будут рассмотрены несколько позже. Следующие три прерывания, 34, 35 и 36, используются несколько иначе, чем все остальные. В то время как все прерывания ДОС вызываются нашими программами для запуска процудур ДОС, эти три прерывания используются противоположным образом: они вызываются ДОС для запуска процедур в наших программах. Каждое из трех прерываний вырабатывается ДОС в соответствующий момент времени, определенный для каждого из прерываний. Если установить вектора этих прерываний таким образом, чтобы они указывали на процедуры обслуживания прерываний в наших программах, то наши программы будут получать управление в случае возникновения прерывания. Эти три прерывания предназначены для передачи управления программам пользователей при возникновении одного из трех условий. Прерывание 34, шестнадцатиричное значение 22, вырабатывается при завершении программы. Это прерывание позволяет организовать специальные завершающие процедуры, которые будут вызываться, когда ДОС завершает выполнение наших программ. Это позволяет обеспечить выполнение восстановительных процедур независимо от того, как завершится Ваша программа. Прерывание 35, шестнадцатиричное значение 23, вырабатывается при нажатиии комбинации клавиш Ctrl-Break. Это позволяет нашей программе перехватывать сигнал окончания (Break), который служит ДОС указанием аварийно завершить нашу программу. Пример такой возможности Вы можете увидеть в действии при использовании редактора EDLIN, поставляемого вместе с ДОС. Учтите, что ДОС не всегда реагирует на нажатие клавиши Ctrl-Break. Это происходит только в тех случаях, когда опрашивается клавиатура и когда пересылаются данные на экран дисплея. Более подробно об этом будет сказано ниже, при рассмотрении функций ДОС, в частности, функции 8. Прерывание 36, шестнадцатиричное значение 24, возникает в случае ошибки в работе ДОС. В системе предусмотрена проверка условия отклонения от нормального функционирования ДОС, так называемая "критическая ошибка" и прерывание 36 позволяет нашим программам перехватывать управление, когда такое происходит. В настоящее времмя рассматриваются два типа критических ошибок, хотя в дальнейшем могут появиться и другие. Первая, наиболее частая ошибка, - это "аппаратная ошибка диска". Такая ошибка возникает, когда дисковод не может правильно работать, даже после трех попыток ДОС выполнить операцию. Вторая критическая ошибка вызывается нарушением копии таблицы размещения файлов в памяти компьютера (эту таблицу мы рассмотрим в следующей главе). Такая ситуация может возникнуть, если программа случайно будет изменять ячейки в нижних адресах памяти. Следующие за этими тремя прерывания используются более традиционным образом. Прерывание 37, шестнадцатиричное значение 25, используется для чтения секторов дискеты. Тогда как данные из файлов могут считываться с помощью вызовов функций ДОС, это прерывание позволяет читать сектора в любом месте на дискете, независимо от того, являются они частью файла или нет. Необходимо указать область памяти, в которую должна считываться информация, и еще три параметра: дисковод (в виде порядкового номера, где 0 - это дисковод A, а 1, 2 и 3, соответственно B, C и D), число секторов, которые необходимо прочитать, и номер, указывающий первый сектор, который требуется прочитать. Для этой и следующей процедур сектора идентифициуются последовательными номерами. Нумерация начинается с нуля, что соответствует первому сектору на дискете, который, при обычном способе адресации секторов, был бы первым сектором дорожки 0 на стороне 0. (Сведения о дорожках, адресах и сторонах дискеты приведены в главе 5.) Сектора пронумерованы последовательно на первой (сторона 0) стороне дискеты. Номера имеют диапазон от 0 до 319 (шестнадцатиричное значение 13F), а затем, для двухсторонних дискет, продолжаются с первого сектора второй стороны, в диапазоне от 320 (шестнадцатиричное значение 140) до 639 (шестнадцатиричное значение 27F). Этот способ нумерации можно представить в виде формулы. Если пронумеровать стороны дискеты как 0 и 1, дорожки от 0 до 39 и сектора от 1 до 8, то искомый номер сектора для этой служебной процедуры будет вычисляться по формуле: ИНДЕКС = (СЕКТОР - 1) + (ДОРОЖКА * 8) + (СТОРОНА * 320) Эта служебная процедура возвращает однобайтный код ошибки, в котором каждый бит указывает отдельное возможное условие ошибки. Номера битов, их числовые эквиваленты и смысл ошибки приведены в следующей таблице: БИТ ЧИСЛОВОЙ ЗНАЧЕНИЕ ЭКВИВАЛЕНТ ___ __________ ________________________________ 1-ый 128 Нет ответа от дисковода 2-ой 64 Ошибка поиска (головка чтения/записи не перемещается к нужной дорожке) 3-ий 32 Ошибка управления (см. описание контроллера фирмы "НЭК" в главе 2) 4-ый 16 Ошибка циклического избыточного проверочного кода (CRC), озна- чает ошибку в данных 5-ый 8 Ошибка ПДП (ошибка при прямом доступе к памяти) 6-ой 4 Сектор не найден (либо непра- вильный номер сектора, либо ошибка форматирования) 7-ой 2 Дискета защищена от записи (при операции записи) 8-ой 1 Не используется Эта служебная процедура может оказаться очень полезной для чтения секторов той области дискеты, которая отведена для системных целей, например, для чтения загрузочной записи или справочника файлов (см. в главе 5 дополнительные подробности об этих частях дискеты). Прерывание 38, шестнадцатиричное значение 26, используется для записи сектора на диск, аналогично тому как прерывание 37 используется для чтения секторов. Остальные подробности работы этих двух процедур одинаковы. Функции, аналогичные двум последним, позволяет выполнять и система BIOS в ПЗУ. В использовании процедур ДОС, впрочем, имеются преимущества - ДОС обеспечивает автоматическое повторение операции и восстановление в случае ошибкм, а также большую гибкость при использовании различных типов дискет. Две эти процедуры ДОС позволяют за одну операцию читать и писать несколько секторов диска. Преимущества и недостатки чтения/записи по одному сектору за операцию более подробно рассматриваются в главе 7. Прерывание 39, шестнадцатиричное значение 27, реализует операцию, получившую название "завершить, но оставить в памяти". Эта процедура используется программами, которые должны остаться в памяти после загрузки и выполнения. Основное назначение такой процедуры состоит в обеспечении возможности загрузки программ, которые смогут служить для обслуживания прерываний и использования другими программами. ДОС следит за тем, какой объем памяти в нижних адресах используется векторами прерываний и программами ДОС. Любые программы загружаются в область памяти, располагающуюся выше зарезервированной области. При вызове прерывания 39, адрес верхней границы зарезервированной области памяти изменяется и указывает на ячейку, следующую за последней ячейкой программы, которая должна стать резидентной. Когда эта процедура используется программой, которая должна впоследствии выплнять функции обслуживания прерываний, происходит следующее. Программа должна быть выполнена один раз, что указывает ДОС на необходимость загрузить эту программу и передать ей управление. После этого программа только загружает свой собственный адрес в таблицу векторов прерываний и вызывает прерывание 39. Позднее, как только произойдет прерывание, управление будет передано резидентной программе. Помимо семи описанных процедур обслуживания прерываний ДОС, имеется 41 функция ДОС. Каждая из этих функций вызывается с помощью прерывания 33,шестнадцатиричное значение 21. Ниже перечислены все эти функции. Функция номер 0 в точности соответствует прерыванию 32 - она завершает выполнение программы. Очевидно, что нет необходимости обсуждать преимущества того или иного способа осуществления этой операции. Функция номер 1 используется для чтения одного символа, введенного с клавиатуры, и отображения его на экране дисплея (в режиме "эхо"). Эта функция ожидает нажатия клавиши. Если нажата одна из клавиш специального назначения, например, функциональная клавиша, то ее нажатие преобразуется в последовательность двух отдельных символов, для ввода которых необходимо выполнить функцию дважды. При этом первый из двух символов имеет код CHR$(0), а второй - один из символьных кодов. Более подробно использование этих клавиш и их кодов описано в главе 10 при рассмотрении клавиатуры. Эта же функция позволяет обнаруживать специальную комбинацию клавиш Ctrl-Break, которая используется для прерывания работы программы. Функция номер 2 используется для выдачи одного символа на экран дисплея. Для обычных, например, алфавитных, символов эта операция выполняется очень просто. В некоторых, особых случаях выполнение происходит иначе. Все это более подробно рассмотрено в главе 8 и приложении 4. Функция номер 3 используется для ввода одного байта от адаптера асинхронной связи. Эта функция ожидает ввода символа и не возвращает никакой информации об ошибках. Это один из немногих случаев, когда функция ДОС обеспечивает меньший сервис, чем процедуры системы BIOS в ПЗУ. Соответствующие процедуры системы BIOS в ПЗУ описываются в главе 11. Функция номер 4 передает один байт данных через адаптер асинхронной линии связи и, таким образом, выполняет операцию, обратную функции 3. Функция номер 5 используется для передачи одного байта данных устройству печати. В отличие от поцедур системы BIOS в ПЗУ здесь нельзя указать на какое устройство печати должен осуществляться вывод - ДОС работает только с одним устройством. Если к компьютеру подключено несколько устройств печати, то вывод будет осуществляться на первое из них. Соответствующие процедуры системы BIOS в ПЗУ описаны в главе 11. Функция номер 6 довольно любопытна, поскольку она используется как для ввода с клавиатуры, так и для вывода на экран дисплея. Любой символ, кроме CHR$(255) может быть выдан на экран. Если эту функцию вызвать как бы для вывода на экран символа CHR$(255), то тем самым будет инициирован ввод с клавиатуры. Так же как в случае с функцией номер 1, для кодирования специальных клавиш используются двухбайтовые коды. Но, в отличие от функции номер 1, эта функция не ожидает нажатия клавиши - если ни одна не нажата, она возвращает признак отсутствия ввода. Эта функция не распознает Ctrl-Break особым образом. Функция номер 7 аналогична функции номер 1, за исключением того, что символы, вводимые с клавиатуры, не отображаются на экране. Так же как функция номер 6, эта функция не отслеживает нажатия клавиши Ctrl-Break. Функция номер 8 выполняет те же функции, что и функция номер 1, но без отображения вводимых символов на экране. Подобно функции номер 1 и в отличие от функции номер 7, эта функция следит за нажатием клавиши Ctrl-Break. Вы, вероятно, уже заметили, что функции 1,6,7 и 8 обеспечивают четыре процедуры ввода с клавиатуры с одной из восьми возможных комбинаций ожидания нажатия клавиши, отображения введенных символов на экране и проверки нажатия клавиши Ctrl-Break. Чтобы не путаться в их назначении, удобно представить все вышесказанное в виде следующей таблицы: Функция Ожидание Эхо Проверка Ctrl-Break -------- -------- ---- -------------------- 1 да да да 6 нет нет нет 7 да нет нет 8 да нет да Кроме того, функция 6 дублирует еще и функцию вывода на экран. Ясно, что эти процедуры реализуют базовые операции, которые затем используются командами ДОС, и они вовсе не претендуют на логическую законченность при обслуживании клавиатуры. Функция номер 9 используется для вывода на экран дисплея строки символов, причем каждый из символов выводится так же, как это делает функция 2. Определенная странность работы этой функции, которая уменьшает ее полезность, заключается в том, что вместо использования счетчика символов в строке, в качестве ограничителя используется знак денежной едницы, "$". Это лишний раз демонстрирует, что ДОС разрабатывалась не как универсальная система, а как средство для решения определенных специальных задач. Функция номер 10, шестнадцатиричное значение А, обеспечивает буферированный ввод с клавиатуры. В то время как остальные функции ввода немедленно передают введенный символ, эта функция накапливает законченную логическую единицу ввода, которая завершается нажатием клавиши "ввод" (ENTER). Остальные функции ввода с клавиатуры позволяют программам немедленно реагировать на введенные символы. Однако им присущ такой недостаток как необходимость программного выполнения любых операций редактирования, например, интерпретации клавиши возврата на одну позицию, означающей стирание предыдущего символа. Функция номер 10 передает все стандартные средства редактирования ДОС в распоряжение Вашей программы, что может оказаться очень удобным. Каждую из функций нужно использовать в своем случае, что позволит Вам наиболее эффективно пользоваться возможностями, представленными в Ваше распоряжение операционной системой. Чтобы воспользоваться функцией 10, в Вашей программе должен быть предусмотрен буфер ввода, размер которого может изменяться. Первый байт указывает ДОС размер буфера, а второй байт используется ДОС, чтобы сообщить Вам, сколько символов находится в буфере. Функция номер 11, шестнадцатиричное значение В, используется для проверки, нажата ли какая-нибудь клавиша на клавиатуре, без ее ввода. Подобно функции 6, эта функция не ожидает пока будет нажата клавиша. Но, в отличие от функции 6, если клавиша нажата, ее код не вводится и производится проверка нажатия клавиш Ctrl-Break. Функция номер 12, шестнадцатиричное значение С, очищает буфер ввода с клавиатуры от всех введенных в него символов. Может так случиться, что пользователь начнет набирать символы на клавиатуре прежде чем начнется ввод. Если программа обнаруживает ошибку и посылает пользователю сообщение об ошибке, необходимо иметь уверенность в том, что введенные с клавиатуры символы являются ответом на сообщение об ошибке, а не остатком чего-либо введенного раньше. Для этого и служит функция 12, очищающая буфер ввода. (Пояснение того, как работает буфер ввода можно найти в главе 10). Эта функция обычно предшествует выполнению функций 1,6,7,8 и 10. Буфер, о котором идет речь, является внутренним буфером, а не буфером программы, использующимся в функции 10. Далее следуют функции обслуживания дискет. Чтобы лучше понять, о чем здесь пойдет речь, необходимо обратиться к информации об организации файлов на дискетах, имеющейся в главе 5. Для использования большинства из этих функций необходим блок управления файлом (FCB) ДОС, который мы здесь описывать не будем. Функция номер 13, шестнадцатиричное значение D, используется для сброса дисковой подсистемы. Если был изменен номер дисковода, выбираемого по умолчанию, им снова делается дисковод А. См. также функцию 25. Функция номер 14, шестнадцатиричное значение Е, используетяс для установления номера дисковода, выбираемого по умолчанию. Дисковод задается номером от 0 до 3, что соответствует идентификаторам от А до D. См. также функцию 25. Функция номер 15, шестнадцатиричное значение F, используется, чтобы открыть дисковый файл. Ваша программа должна сформировать блок управления файлом стандартного формата ДОС, включающий имя файла. Если файл не найден на дискете, то программе возвращается признак ошибки. Если необходимо в случае отсутствия файла с указанным именем создать новый файл с таким именем, следует использовать функцию 22. Фактическое открытие файла устанавливает логическое соединение между элементом справочника файлов и блоком управления файлом в программе. Функция номер 16, шестнадцатиричное значение 10, используется, чтобы закрыть файл, который был открыт функцией 15. Практический смысл функции закрытия файла заключается в модификации элемента справочника файла на дискете. Функция номер 17, шестнадцатиричное значение 11, используется для запуска поиска в справочнике файлов дискеты. Эта функция используется при указании неполных или родовых имен файлов, таких как "В:*.ВАК" или "???QQ.INC". Если найдено подходящее имя, тогда ДОС сформирует полный блок управления файлом для этого файла, что позволит Вашей программе открыть файл. Использование родовых имен повышает гибкость и расширяет возможности работы с файлами. Функция номер 18, шестнадцатиричное значение 12, используется для продолжения поиска файлов по родовому имени, начатого функцией 17. Функция 17 запускает поиск и возвращает первое из подходящих имен. Функция 18 продолжает поиск и возвращает имена всех последующих подходящих файлов. Функция номер 19, шестнадцатиричное значение 13, используется для удаления файла с дискеты. Заданное имя файла может быть родовым, так что не требуется использовать функции 17 и 18 для удаления группы файлов. Функция номер 20, шестнадцатиричное значение 14, используется для последовательного чтения файла. Из файла считывается очередная запись. Если чтение завершилось неудачей, то передается признак ошибки. Функция номер 21, шестнадцатиричное значение 15, используется для последовательной записи в файл. Если операция записи прошла неудачно, то передается признак ошибки. Эти функции последовательного чтения и записи, а также функции прямого чтения и записи, 33 и 34, описанные ниже, используются только для записей фиксированной длины - ДОС не обеспечивает средств для работы с записями переменной длины, например, строками в текстовом файле. Для работы с записями переменной длины Ваши программы должны осуществлять логическую обработку записей. Одно из лучших средств для этого заключается в описании файла в терминах ДОС как последовательного файла с записями длиной в один байт, которые Вы сможите читать и писать посимвольно. Функция номер 22, шестнадцатиричное значение 16, используется для "создания" файла. Если файл с таким именем существует, то он используется повторно; если нет - то создается новый элемент справочника файлов с нулевой длиной данных. Эта функция также открывает файл, так что ее можно использовать вместо функции 15, если файл необходимо открыть, независимо то того, сущетвует файл или нет. Функция 23, шестнадцатиричное значение 17, используется для переименования одного или нескольких файлов. Для этой функции также могут использоваться родовые имена. Функции с номером 24 не существует. Функция номер 25, шестнадцатиричное значение 19, используется для определения номера дисковода, использующегося сейчас по умолчанию. Числовой код дисковода от 0 до 3 соответствует именам от А до D. См. также функции 13 и 14. Функция номер 26, шестнадцатиричное значение 1А, используется для установления адреса рабочей области диска, DTA, в которой будут выполняться операции с дискетой. Если Ваши программы не заменяют область DTA, устанавливаемую по умолчанию, в ней будет всего 128 байт и нельзя будет пересылать записи большей длины. DTA - это не то же самое, что буфер чтения/записи секторов, используемый ДОС. Функция номер 27, шестнадцатиричное значение 1В, используется для определения адреса памяти, по которому находится таблица размещения файлов текущего дисковода и другой информации о дискете. Эта функция может быть использована для просмотра таблицы размещения файлов, например, чтобы установить сколько места осталось на дискете. Начиная с версии 2.00 ДОС эта функция обеспечивает доступ только к первой части ТРФ, которая определяет тип дискеты. Функции с номерами от 28 до 32 не существуют. Функция номер 33, шестнадцатиричное значение 21, используется для чтения произвольной записи, указываемой логическим номером записи. ДОС вычисляет положение произвольной записи по фиксированной длине записи и ее номеру. Функция номер 34, шестнадцатиричное значение 22, используется для произвольной записи на дискету. Функция номер 35, шестнадцатиричное значние 23, используется для определения размера файла. При использовании этой функции имеет место ряд странностей. Можно использовать родовое имя файла. Файл не должен быть открыт. Размер файла определяется в терминах длины записи, указанной в блоке управления неоткрытым файлом. Чтобы получить размер файла в байтах, необходимо установить размер записи равным одному байту. Функция номер 36, шестнадцатиричное значение 24, используется при переходе от последовательного режима к произвольному. Она устанавливает поле произвольной записи в ту же позицию, в которой находится текущая последовательная запись. Следующие две функции не относятся к обслуживанию дискет. Функция номер 37, шестнадцатиричное значение 25, используется для установки вектора прерывания. Поскольку вектора прерыванмй устанавливаются очень просто, непонятно для чего нужна эта функция - разве что для обеспечения дополнительной степени защиты. Функция номер 38, шестнадцатиричное значение 26, используется для создания нового программного сегмента в порядке подготовки к запуску зависимой программы. Теперь мы снова вернемся к функциям, обслуживающим файлы на дискетах. Функция номер 39, шестнадцатиричное значение 27, используется для чтения нескольких записей, начиная с произвольной позиции в файле. Эта функция может быть использована вместо нескольких отдельных вызовов функции 33, если объем памяти позволяет считывать целые блоки из файлов. Функция номер 40, шестнадцатиричное значение 28, используется при записи в файл, начиная с произвольной позиции, нескольких записей. Функция номер 41, шестнадцатиричное значение 29, используется для преобразования имени файла в том виде, в каком оно вводится пользователем, например, "В:CHAPTER.4", в формат блока управления файлом, который используется ДОС. Это несомненно очень полезная функция, которая позволяет вводить имена файлов в обычном виде и возлагать всю работу по разбору и преобразованию на ДОС. Если необходимо, эта функция позволит Вам задать идентификатор дисковода, имя файла или расширение имени по умолчанию, когда они не указаны в анализируемой строке. Эта функция также позволяет преобразовывать родовые имена файлов, включающие звездочку в формат родового имени, состоящего из вопросительных знаков, как того требует формат блока управления файлом. Функция номер 42, шестнадцатиричное значение 2А, используется для считывания системной даты. Дата выдается в виде трех двоичных чисел, соответствующих году, месяцу и дню месяца. Как мы увидим в главе 11, дата автоматически модифицируется при первом же запросе даты или времени после очередной полуночи. Это происходит при любом запросе времени, включая модификацию времени создания файла в элементе справочника файлов. Если время не запрашивалось в промежутке от полуночи до полуночи хотя бы один раз, то дата будет неверной. Функция номер 43, шестнадцатиричное значение 2В, используется для установки системной даты. Функция номер 44, шестнадцатиричное значение 2С, используется для считывания системного времени. Время выдается в часах, минутах, секундах и сотых долях секунды. Счетчик таймера, использующийся для подсчета системного времени, изменяется примерно 18 раз в секунду, так что значение сотых долей секунды довольно приблизительно. Поскольку таймер должен перезапускаться примерно каждые 0,0546 секунды, его нельзя использовать для измерения очень коротких промежутков времени. Вычисление сотых долей секунды, однако, выполняется точно по показаниям счетчика таймера и через определенный промежуток времени значения сотых долей секунды будут равномерно распределены в диапазоне от 0 до 99. Это означает, что Ваши программы могут использовать системное время для генерации псевдо-случайных чисел. Функция номер 45, шестнадцатиричное значение 2D, используется для установки системного времени. Функция номер 46, шестнадцатиричное значение 2Е, используется для управления верификацией записи на дискету. Если верификация разрешена, то каждая операция записи будет проверяться на возможность возникновения ошибки путем повторного считывания данных и их сравнения с исходными данными. Маловероятно, что Вам потребуется эта функция, так как дискеты достаточно надежны и довольно значительные проверки выполняются автоматически. Но, если Вам потребуется верификация, то используйте функцию 46. Мы перечислили все имеющиеся функции ДОС. Позднее, когда мы рассмотрим все возможности, предоставляемые системой BIOS в ПЗУ, Вы заметите, что некоторые функции дублируются. Однако, в большинстве случаев ДОС и BIOS в ПЗУ обслуживают совершенно различные нужды. В следующей главе мы начинаем рассмотрение важного предмета - дискет и форматов хранения данных на дискетах.
Оставить комментарий
Комментарии
1.
8 октября 2005, 19:10:42
Доброе вреемя суток, всё, комп уже в дауне у меня, срочно нужен диск с досом, не дискетта, так как дискеты мой комп не читает, кстати, это тоже глюк! Нужен типо загрузочный диск с досом, но в наличии нет, отдал я винду 98, и не смогу пока взять назад, где можно скачать его? иначе
Ну как вы поняли, надо мне загр. диск с ДОСом... срочно!Помогите пожалуйста!
Ну как вы поняли, надо мне загр. диск с ДОСом... срочно!Помогите пожалуйста!