Жанр: Учеба

Программно-аппаратная организация компьютера IBM PC

сторінка №7

ние адреса) и позволить другим программам затирать эту область
памяти.
Когда снова возникает необходимость использования интерпретатора
команд, резидентная часть С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,

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.