Стандартные процедуры функции модуля dos. Модульное программирование. Процедуры для работы с датой и временем

Помощь 18.03.2019

Изучаем Linux, 101

Редактирование файлов с помощью vi

Редактор, который всегда под рукой

Серия контента:

Краткий обзор

Из этой статьи вы узнаете об основных приемах работы с редактором vi, который есть практически в каждом дистрибутиве UNIX или Linux. Вы научитесь:

  • Перемещаться по документу с помощью vi.
  • Использовать основные режимы vi.
  • Вставлять, редактировать, удалять, копировать и искать текст.
Об этой серии

Эта серия статей поможет вам освоить задачи администрирования операционной системы Linux. Вы также можете использовать материал этих статей для подготовки к .

Чтобы посмотреть описания статей этой серии и получить ссылки на них, обратитесь к нашему . Этот перечень постоянно дополняется новыми статьями по мере их готовности и содержит самые последние (по состоянию на апрель 2009 года) цели экзаменов сертификации LPIC-1. Если какая-либо статья отсутствует в перечне, можно найти ее более раннюю версию, соответствующую предыдущим целям LPIC-1 (до апреля 2009 года), обратившись к нашим .

Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 103.8 темы 103. Цель имеет вес 3.

Предварительные требования

Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать базовыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все встречающиеся команды. Иногда различные версии программ выводят результаты по-разному, поэтому содержимое листингов и рисунков может отличаться от того, что вы увидите на вашем компьютере.

Перемещение по документу с помощью vi

Как связаться с Яном

Ян – один из наших наиболее популярных и плодовитых авторов. Ознакомьтесь со (EN), опубликованными на сайте developerWorks. Вы можете найти контактные данные в и связаться с ним, а также с другими авторами и участниками ресурса My developerWorks.

Редактор vi есть практически в каждом дистрибутиве Linux и UNIX. Фактически, если в операционной системе имеется только один редактор, то, скорее всего, это именно vi, поэтому очень важно уметь работать с ним. В этой статье представлены лишь основные команды редактирования vi, а полную информацию о vi вы можете найти в руководстве " " (EN) на сайте developerWorks, на соответствующих man-страницах или в одной из многочисленных книг, посвященных этому редактору.

Запуск vi

Сегодня многие дистрибутивы Linux поставляются с редактором vim (V i IM proved – улучшенный vi), а не с классической версией vi. Редактор vim обратно совместим с vi, и помимо стандартного текстового интерфейса имеет графический интерфейс (gvim). Обычно команда vi является символической ссылкой на программу vim. Существует несколько версий vim: крошечный (tiny), маленький (small), обычный (normal), большой (big) и огромный (huge). Версию vim, которая используется в вашей операционной системе, а также ее возможности, можно узнать с помощью команды

vi --version

В предыдущей статье этой серии " " мы хотели изменить приоритет работающего сценария командной оболочки count1.sh. Если вы пытались сделать это самостоятельно, то, возможно, обнаружили, что команды выполнялись настолько быстро, что вы не успевали изменить приоритет с помощью renice . Итак, давайте начнем работу с редактором vi и добавим в начало сценария строку для вставки 20-секундной паузы, благодаря которой мы сможем успеть изменить приоритет.

Если у вас нет под рукой сценария count1.sh, то можно сделать следующее: откройте окно терминала, перейдите в вашу домашнюю директорию и скопируйте в окно содержимое листинга 1. В результате в вашей домашней директории будет создана поддиректория lpi103-8, содержащая файл сценария count1.sh.

Листинг 1. Сценарий, нагружающий центральный процессор – count1.sh
mkdir -p lpi103-8 && cd lpi103-8 && {echo "x="$1"">count1.shecho "echo "$2" $(date)">>count1.shecho "while [ $x -gt 0 ]; do x=$((x-1));done">>count1.shecho "echo "$2" $(date)">>count1.sh }

Для редактирования существующего файла наберите команду vi , указав имя этого файла в качестве параметра. Подробную информацию о различных опциях вы можете найти на man-страницах или в разделе , а пока давайте запустим редактор без каких-либо опций:
vi count1.sh
В результате должен открыться файл count1.sh. Вы должны увидеть нечто похожее на листинг 2. Если вы используете vim, то некоторые слова или символы могут быть выделены цветом. В редакторе vim имеется режим выделения цветом (отсутствующий в оригинальном vi), который может быть включен в вашей системе по умолчанию.

Листинг 2. Редактирование сценария count1.sh в vi
x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do x=$((x-1));done echo "$2" $(date) ~ ~ ~ ~ "count1.sh" 4L, 84C 1,1 All

Редактор vi начал разрабатываться еще в те времена, когда не все терминальные клавиатуры имели клавиши управления курсором, поэтому в vi вы можете делать все с помощью клавиш, расположенных на стандартной буквенно-цифровой клавиатуре, а также нескольких специальных клавиш, таких как Esc и Insert . Тем не менее, вы можете настроить vi на использование дополнительных клавиш современной компьютерной клавиатуры; большинство клавиш из имеющихся на вашей клавиатуре выполняют в vi какие-то полезные действия. Благодаря своему наследию, а также медленным подключениям старых терминалов, vi имеет заслуженную репутацию редактора, в котором используются краткие и загадочные команды. Давайте начнем с рассмотрения комбинаций клавиш, предназначенных для навигации по файлам.

Перемещение

Следующие команды предназначены для перемещения по файлу:

h Перейти на один символ влево в текущей строке. j Перейти к следующей строке. k Перейти к предыдущей строке. l Перейти на один символ вправо в текущей строке. w Перейти к следующему слову в текущей строке. e Перейти к концу текущего слова в текущей строке. b Перейти к началу текущего слова в текущей строке. Ctrl-f Прокрутить одну страницу вперед. Ctrl-b Прокрутить одну страницу назад.

Если вы наберете перед любой из этих команд число, то команда будет выполнена указанное количество раз. Это число называется счетчиком повторений или просто счетчиком . Например, команда 5h переместит курсор на пять символов влево. Счетчики повторений можно использовать со многими командами vi.

Перемещение по строкам

Следующие команды предназначены для перехода к определенным строкам файла.

G Перейти к определенной строке файла. Например, команда 3G перемещает курсор к строке 3. Команда G без каких-либо параметров перемещает курсор к последней строке файла. H Перейти к определенной строке относительно верхнего края экрана. Например, команда 3H перемещает курсор к третьей строке относительно верхнего края экрана. L Подобна команде H, но отсчет происходит относительно последней строки экрана. Таким образом, команда 2L перемещает курсор на вторую строку относительно нижней строки экрана.

Поработайте с этими командами и научитесь свободно использовать их. Если в процессе работы что-то пойдет не так, то всегда можно выйти из vi. Как это сделать, рассказывается далее.

Выход из vi

Всегда необходимо уметь выйти из редактора. Это позволит не испортить важный файл, если при его редактировании вы допустите какую-либо критическую ошибку. Из vi можно выйти следующими способами: с сохранением изменений, без сохранения изменений, с перезапуском редактирования файла с самого начала. Если приведенные ниже команды не работают, то проверьте, не находитесь ли вы в режиме вставки, о котором вы узнаете чуть позже. Если вы сомневаетесь, то нажмите клавишу Esc для выхода из режима вставки и возврата в режим команд, в котором эти команды должны работать.

:q! Завершить редактирования файла с отменой всех изменений. Эта команда очень часто используется при возникновении трудностей. :w! Записать файл (независимо от того, был ли он изменен или нет). Предпринимается попытка перезаписать существующие файлы, файлы с доступом только для чтения или другие неперезаписываемые файлы. В качестве параметра можно указать имя, под которым будет сохранен исходный файл, который вы начинали редактировать. Зачастую безопаснее не использовать символ!, если вы не уверены на все 100% в том, что вы сделали. ZZ Записать файл, если он был изменен, а затем выйти из редактора. Эта команда обычно используется для нормального выхода из vi. :e! Редактировать текущую копию файла на диске. Выполняется повторная загрузка файла с отменой всех внесенных изменений. Эту команду можно также использовать в тех случаях, когда файл на диске по какой-то причине был изменен и вам требуется использовать его последнюю версию. :! Запустить команду интерпретатора. Наберите команду и нажмите клавишу Enter . По завершении работы команды вы увидите ее вывод и приглашение вернуться в редактор vi.

Примечания.

  1. Когда вы набираете двоеточие (:), курсор перемещается в нижнюю строку экрана, в которой можно набирать команду и ее параметры.
  2. Если в вышеперечисленных командах пропустить восклицательный знак, то можно получить сообщение о ошибке, например, о невозможности сохранения изменений или записи в конечный файл (если вы редактируете файл с доступом только на чтение).
  3. Существуют длинные формы команд: (:quit, :write, :edit), однако используются они редко.

Режимы vi

Редактор vi может работать в двух режимах.

Режим команд В режиме команд вы перемещаетесь по файлу и редактируете файл, выполняя такие операции, как поиск, удаление, изменение текста и так далее. Обычно vi запускается в режиме команд. Режим вставки В режиме вставки вы набираете новый текст, начиная с позиции курсора. Для возврата в режим команд нажмите клавишу Esc .

Эти два режима определяют поведение редактора. Все, что вы набираете в режиме вставки, считается текстом, который необходимо вставлять в файл. Если вы пытаетесь набрать команду, и ничего не происходит (или символы появляются под курсором), то, вероятно, вы забыли нажать клавишу Esc для выхода из режима вставки.

Редактирование текста

Теперь, когда вы умеете открывать файлы в редакторе vi, перемещаться по ним и выходить из vi, пришло время узнать, как редактировать текст в файле.

Изменение текста

Для вставки, удаления или изменения текста используйте следующие команды. Заметьте, что некоторые из них могут быть записаны как в верхнем, так и в нижнем регистре (описание будет дано ниже).

i Перейти в режим вставки перед символом в текущей позиции. Наберите текст и нажмите клавишу Esc для возврата в режим команд. Используйте команду I для вставки текста в начале текущей строки. a Перейти в режим вставки после символа в текущей позиции. Наберите текст и нажмите клавишу Esc для возврата в режим команд. Используйте команду A для вставки текста в конце текущей строки. c Изменить текущий символ и перейти в режим вставки для ввода символов замены. o Вставить новую строку после текущей строки. Используйте команду O для вставки новой строки над текущей строкой. cw Удалить оставшуюся часть текущего слова и перейти в режим вставки для его замены. Используйте счетчик повторений для замещения нескольких слов. Используйте команду c$ для замены оставшейся части строки. dw То же самое, что и cw (и c$), но без перехода в режим вставки. dd Удалить текущую строку. Используйте счетчик повторений для удаления нескольких строк. x Удалить символ в позиции курсора. Используйте счетчик повторений для удаления нескольких символов. p Поместить последний удаленный текст после текущего символа. Используйте команду P, чтобы поместить текст перед текущим символом. xp Полезная команда из комбинации x и p. Замещает символ в позиции курсора символом, находящимся справа от него.

Поиск текста

Вы можете искать текст в файле, используя регулярные выражения.

/ Используйте регулярное выражение после символа / для прямого поиска в файле. ? Используйте регулярное выражение после символа? для поиска в файле в обратном направлении. n Используйте n для повторения последнего поиска в любом из направлений.

Все вышеперечисленные команды можно предварять счетчиком повторений. Так, команда 3/x (так же, как и команда /x, после которой следует 2n) будет искать третье вхождение x, начиная с текущей позиции. Аналогично, команда 2/^e будет искать вторую строку, начинающуюся на e, относительно текущей позиции.

Обратите внимание на то, что при достижении конца файла поиск продолжится с начала файла.

Справочная информация

Еще одна полезная команда vi – это команда справки, которую можно вызвать, набрав:help . Справка открывается в самом редакторе vi; используйте команду:q , чтобы закрыть справку и продолжить работу. Если вам необходима информация по какой-то определенной тематике (например, перестановка строк), то попробуйте добавить соответствующее слово после команды:help, например, :help wrap .

Собираем все вместе

В начале статьи мы собирались добавить строку в наш файл count1.sh. Чтобы сохранить исходный файл и записать его измененную версию под именем count2.sh, мы можем использовать команды редактора после того, как откроем этот файл при помощи команды vi . Заметьте, что обозначение соответствует нажатию клавиши Esc .

Листинг 3. Команды редактора для добавления строки в файл count1.sh
1GOsleep 20 :w! count2.sh:q

Эти команды выполняют следующие действия:

1G Переход в первую строку файла. O Добавление новой строки над текущей строкой и переход в режим вставки. sleep 20 Текст, который необходимо добавить. Нажатие клавиши Esc для возврата в режим команд. :w! count2.sh Запись файла на диск. :q Выход из vi.

Все просто, когда знаешь, как.

Эта статья последняя из серии статей по теме 103 экзамена LPI 101 на администратора начального уровня (LPIC-1). Ссылки на остальные статьи этой серии вы можете найти в .

Работа добавлена на сайт сайт: 2016-03-30

">Учебная практика 2.

">Системный модуль " xml:lang="en-US" lang="en-US">DOS ">, " xml:lang="en-US" lang="en-US">WinDOS ">.

">Файлы в Паскале

Основные процедуры и функции для работы с файлами

">1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:

">Assign(<файловая_переменная>, <имя_дискового_файла>)

">Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например " xml:lang="en-US" lang="en-US">:

">Пример " xml:lang="en-US" lang="en-US"> ">процедуры " xml:lang="en-US" lang="en-US"> Assign ">в " xml:lang="en-US" lang="en-US"> ">Паскале " xml:lang="en-US" lang="en-US">

" xml:lang="en-US" lang="en-US"> Assign (chf, "G:\Home\ Student\ Lang\ Pascal\ primer.dat");

">Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.

">Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:

">CON – консоль, т.е. клавиатура-дисплей;

">PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.

">Не разрешается связывать с одним физическим файлом более одной файловой переменной.

">2.После окончания работы с файлами на Паскале, они должны быть закрыты.

">Close(<список файловых переменных>);

">При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.

">Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.

">3.Подготовка к записи в файл Паскаля

"> Rewrite(<имя_ф_переменной>);

">Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:

">4.Запись в файл Паскаля

">Write(<имя_ф_переменной>, <список записи>);

">При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла.

">Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.

">5.Подготовка файла к чтению Паскаля

">Reset(<имя_ф_переменной>);

">Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла.

">Если происходит попытка открыть для чтения не существующий еще на диске файл, то возникает ошибка ввода/вывода, и выполнение программы будет прервано.

">6.Чтение из файла в Паскале

">Read(<имя_ф_переменной>,<список переменных>);

">Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.

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

">7.Функция определения достижения конца файла в Паскале

">Eof(<имя_ф_переменной>);

">Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.

">8.Изменение имени файла в Паскале

">Rename(<имя_ф_переменной>, <новое_имя_файла>);

">Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.

">9.Уничтожение файла в Паскале

">Erase(<имя_ф_переменной>);

">Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

">10.Уничтожение части файла от текущей позиции указателя до конца в Паскале

">Truncate(<имя_ф_переменной>);

">11.Файл Паскаля может быть открыт для добавления записей в конец файла

">Append(<имя_ф_переменной>);

">Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).

">Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.

">Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:

">fileSize(<имя_ф_переменной>) – функция Паскаля, определяющая число компонентов в файле;

">filePos(<имя_ф_переменной>) – функция Паскаля, значением которой является текущая позиция указателя;

">seek(<имя_ф_переменной>,n) – процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek(<имя_ф_переменной>,0) установит указатель в начало файла, а процедура seek(<имя_ф_переменной>, FileSize(<имя_ф_переменной>)) установит указатель на признак конца файла.

">Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.

">Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.

">В списке записываемых в текстовый файл элементов могут чередоваться в произвольном порядке числовые, символьные, строковые выражения. При этом строковые и символьные элементы записываются непосредственно, а числовые из машинной формы автоматически преобразуются в строку символов.

">Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.

" xml:lang="en-US" lang="en-US">DOS

">С помощью модулей Dos и WinDos реализуется целый ряд программ операционной системы и программ обработки файлов. Ни одна из программ модуля Dos не определена в стандартном Паскале, поэтому они помещаются в отдельный модуль.

">Более полное описание операций DOS приведено в руководствах по DOS фирмы IBM.

">Основное различие модулей Dos и WinDos состоит в том, что процедуры и функции модуля Dos используют стандартные строки Паскаля, а процедуры и функции модуля WinDos - строки с завершающим нулем. Стандартная строка Паскаля - это байт длины, за которым следует последовательность символов. Строка с завершающим нулем - это последовательность ненулевых символов с завершающим символом NULL (#0).

">Процедуры и функции модуля " xml:lang="en-US" lang="en-US">Dos ">.

Функция DiskFree

"> Возвращает количество свободных байтов указанного диска.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DiskFree(Drive: Byte): Longint;

">Замечания:

"> Функция DiskFree может оказаться полезной для определения наличия свободного места на диске.

Функция DiskSize

"> Возвращает общий размер свободного места на диске, в байтах.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DiskSize(Drive: Byte): Longint;

" xml:lang="en-US" lang="en-US"> ">Переменная Drive – это диск для проверки, где A = 1, B = 2 и т.д. Если Drive = 0, то используется текущий диск.

Функция DosExitCode

"> Возвращает код выхода из подпроцесса.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DosExitCode: Word;

Функция DosVersion

" xml:lang="en-US" lang="en-US"> ">Возвращает " xml:lang="en-US" lang="en-US"> ">версию " xml:lang="en-US" lang="en-US"> DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function DosVersion: Word;

Функция EnvCount

">Возвращает количество строк, содержащихся в системном окружении.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function EnvCount: Integer;

Функция EnvStr

" xml:lang="en-US" lang="en-US"> ">Возвращает указанную строку окружения.

">Объявление:

" xml:lang="en-US" lang="en-US">function EnvStr(Index: Integer): string;

">Замечания:

"> Переменная Index – это номер переменной окружения, например, первая переменная – это 1, вторая – 2 и т.д. Неправильный индекс возвращает пустую строку.

"> Функция EnvStr возвращает строку в форме (VarName=String). Если порядок переменных системного окружения неизвестен, то используют функцию GetEnvto для поиска переменной по имени.

Процедура Exec

"> Выполняет указанную программу с указанной командной строкой.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Exec(Path, CmdLine: string);

">Замечания:

"> Переменная Path – это диск, директория и имя программы для выполнения. Переменная CmdLine содержит аргументы командной строки.

"> Процедура Exec передает управление программе, указанной в переменной Path. При этом распределение памяти не изменяется. После завершения процедуры Exec используйте функцию DosExitCode для определения кода выхода из программы. Процедура Exec также устанавливает значение переменной DosError, если случается ошибка.

"> Процедура Exec не выполняет программы, которые требуют Блок Управления Файлом - File Control Blocks (FCB).

Функция FExpand

"> Преобразует имя файла в полный путь к файлу.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function FExpand(Path: PathStr): PathStr;

Процедура FindFirst

"> Ищет указанный каталог для соответствующего файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);

">Замечания:

"> Переменная Path – это диск и каталог, в котором будет выполняться поиск и имя файла для поиска. Шаблоны следующие, например, "MYFILE??.*".

"> Переменная Attr содержит атрибуты файла для включения в поиск в добавление ко всем нормальным файлам.

"> Процедура FindFirst используется совмествно с процедурой FindNext. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.

Процедура FindNext

"> Находит следующее вхождение, которое соответствует имени и атрибутам, указанным в предварительно вызванной процедуре FindFirst.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FindNext(var F: TSearchRec);

">Замечания:

"> Процедура FindNext используется совместно с процедурой FindFirst. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска, предварительно определенных для процедуры FindFirst. Переменная F должна быть той же самой переменной, которая была использована для ввода в FindFirst. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.

Функция FSearch

"> Поиск файла.

">Объявление:

" xml:lang="en-US" lang="en-US">function FSearch(Path: PathStr; DirList: string): PathStr;

">Замечания:

"> Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная DirList – это список директорий, разделенных точкой с запятой (;), которые будут включены в поиск.

"> Функция FSearch возвращает каталог и имя файла, если файл существует. Если файл, указанный в переменной Path, не найден в списке директорий, то возвращается пустая строка. Функция FSearch всегда начинает поиск с текущей директории, а затем проверяет директории, перечисленные в переменной DirList в том порядке, в котором они перечислены.

Процедура FSplit

"> Разделяет имя файла на три компонента.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure FSplit(Path: PathStr; var Dir: DirStr; var Name: NameStr; var Ext: ExtStr);

">Замечания:

"> Используйте эту процедуру для разделения полного имени файла на три компонента: путь, имя файла и расширение файла. Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная Dir возвращает путь или часть переменной Path, которая содержит каталог (или каталоги). Переменная Name возвращает фактическое имя файла без расширения. Переменная Ext возвращает расширение файла, которому предшествует точка (.).

"> Возможно, что один или более компонентов вернутся пустыми. Это может случиться, если переменная Path не содержит этих компонентов. Например, в том случае, если в переменной Path указан пустой каталог.

Процедура GetCBreak

"> Возвращает состояние проверки Ctrl-Break в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetCBreak(var Break: Boolean);

">Замечания:

"> Возвращает TRUE, если Ctrl-Break включена, иначе возвращает FALSE.

"> С включенной проверкой Ctrl-Break c все вызовы ввода/вывода (консоль, принтер и коммуникации) являются проверяемыми. Чтобы выключить Ctrl-Break, используйте процедуру SetCBreak.

Процедура GetDate

"> Возвращает текущую дату, установленную в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetDate(var Year, Month, Day, DayOfWeek: Word);

Функция GetEnv

"> Возвращает значение указанной переменной окружения.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">function GetEnv(VarName: string): string;

">Замечания:

">VarName – имя переменной для поиска. Если VarName не существует как переменная окружения, то возвращается пустая строка.

">Функция GetEnv возвращает строку, назначенную для переменой окружения.

Процедура GetFAttr

">Возвращает атрибуты файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetFAttr(var F; var Attr: Word);

">Замечания:

">F – это файловая переменная, а также типизированный, нетипизированный или текстовый файл, который не открыт. Переменная Attr содержит атрибуты файла.

"> Файл, связываемый с переменной F, должен быть закрыт. Переменная Attr должна сравниваться с одной из констант атрибутов, которые определены в модуле DOS, с помощью ЛОГИЧЕСКОГО И (AND).

"> Ошибки записываются в переменную DosError, которая определена в модуле DOS. Для большей информации о файловых атрибутах обращайтесь к справочному руководству по вашей DOS.

Процедура GetFTime

">Возвращает дату и время последнего изменения файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetFTime(var F; var Time: Longint);

">Замечания:

"> Файл, связанный с переменной F должен быть открыт. Время может быть распаковано с помощью процедуры UnPackTime. Ошибки записываются в переменную DosError, которая определена в модуле DOS.

">Процедура GetIntVec

">Возвращает адрес, записанный в указанном векторе прерывания.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: Pointer);

" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: FarPointer);

">Замечания:

"> Учтите, что процедура GetIntVec возвращает адрес прерывания защищенного режима. Чтобы получить вектор прерывания реального режима, используйте процедуру GetRealIntVec. Прерывания могут происходить в защищенном или реальном режиме.

Процедура GetTime

">Возвращает текущее время, установленное в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetTime(var Hour, Minute, Second, Sec100: Word);

">Замечания:

"> Диапазоны возвращаемых значений следующие: Hour (Час) , Minute (Минута) , Second (Секунда) и Sec100 (сотая доля секунды) .

Процедура GetVerify

"> Возвращает состояние проверочного флага в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure GetVerify(var State: Boolean);

">Замечания:

">State = TRUE, если проверочный флаг DOS включен, иначе FALSE.

"> С включенным проверочным флагом DOS все выводимые на диск данные проверяются на целостность. Иначе выводимые данные не проверяются. Чтобы установить состояние проверочного флага DOS, используйте процедуру SetVerify.

Процедура Intr

"> Выполняет указанное программное прерывание.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Intr(IntNo: Byte; var Regs: TRegisters);

">Замечания:

"> Перед вызовом процедуры Intr, загрузите переменную Regs соответствующими параметрами, необходимыми для прерывания. Переменная Regs возвращает значения регистров после вызова прерывания. Вызовы, которые используют регистры ESP и SS не могут быть выполнены. Более подробную информацию о программных прерываниях ищите в руководствах на ваши BIOS и DOS.

"> Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль перед вызовом процедуры Intr. Все прерывания, вызов которых требует анализа смещения, должны использовать 32-битное смещение.

Процедура Keep

">Эта процедура является только составляющей частью и всегда выдает сообщение об ошибке во время выполнения.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure Keep(ExitCode: Word);

Процедура MsDos

" xml:lang="en-US" lang="en-US"> ">Выполняет вызов функции DOS.

">Объявление:

" xml:lang="en-US" lang="en-US">procedure MsDos(var Regs: TRegisters);

">Замечания:

"> Загрузите переменную Regs соответствующими параметрами перед вызовом MS-DOS. Переменная Regs возвращает значения регистров после вызова прерывания. Учтите, что тип TRegisters позволяет доступ к 32-битным регистрам. Вызовы DOS, которые используют регистры ESP и SS не могут быть выполнены. Для прерывания, отличного от $21, используйте процедуру Intr. Более подробную информацию о программных прерываниях DOS ищите в руководствах на вашу DOS.

"> Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль для использования MS-DOS.

Процедура PackTime

"> Преобразует запись " xml:lang="en-US" lang="en-US">DateTime ">.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure PackTime(var T: DateTime; var Time: Longint);

">Замечания:

"> Процедура PackTime может быть использована совместно с процедурой SetFTime. Для распаковки 4-х байтового пакета дата/время в запись DateTime используйте процедуру UnpackTime.

Процедура SetCBreak

"> Устанавливает состояние проверки Ctrl-Break.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetCBreak(Break: Boolean);

">Замечания " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US"> ">С включенной проверкой Ctrl-Break, проверяются все вызовы операций ввода/вывода (консоль, принтер и коммуникации). Чтобы получить состояние Ctrl-Break, используйте процедуру GetCBreak.

Процедура SetDate

"> Устанавливает текущую дату в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetDate(Year, Month, Day: Word);

">Замечания:

"> Неправильная дата игнорируется операционной системой. Для получения текущей даты используйте процедуру GetDate.

Процедура SetFAttr

"> Устанавливает атрибуты файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetFAttr(var F; Attr: Word);

">Замечания:

"> Файл, связанный с переменной F должен быть закрыт. Переменная Attr должна быть сформирована с помощью операции ЛОГИЧЕСКОЕ ИЛИ (OR) между этой переменной и одной из констант файловых атрибутов. Эти константы определенны в модуле DOS.

"> Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию о файловых атрибутах ищите в руководствах на вашу DOS.

">Процедура " xml:lang="en-US" lang="en-US">SetFTime

"> Устанавливает дату и время последнего изменения файла.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetFTime(var F; Time: Longint);

">Замечания: Файл, связанный с переменной F должен быть открыт. Упакованный формат дата/время может быть создан с помощью процедуры PackTime. Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию об упакованном формате дата/время ищите в руководствах на вашу DOS.

Процедура SetIntVecs

"> Устанавливает указанный вектор прерывания для указанного адреса.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: Pointer);

" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: FarPointer);

">Замечания:

"> Прерывания могут происходить в защищенном или реальном режиме.

Процедура SetTime

"> Устанавливает текущее время в операционной системе.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetTime(Hour, Minute, Second, Sec100: Word);

">Замечания:

"> Неправильное значение игнорируется. Для получения текущего времени операционной системы используйте процедуру GetTime.

Процедура SetVerify

"> Устанавливает состояние флага проверки в DOS.

">Объявление " xml:lang="en-US" lang="en-US">:

" xml:lang="en-US" lang="en-US">procedure SetVerify(Verify: Boolean);

Процедура SwapVectors

" xml:lang="en-US" lang="en-US"> ">Процедура SwapVectors ничего не делает и предоставляется только для совместимости с Borland Pascal.

">Объявление: procedure SwapVectors;

Процедура UnpackTime

"> Преобразует переменную типа Longint в запись.

">Задание для самостоятельной работы.

">1. Написать программу для работы с файлами. При запуске программа должна выдавать главное меню с выбором команд.

  1. ">При выборе команды 1 происходит создание файла с расширением " xml:lang="en-US" lang="en-US">txt "> и добавление в файл определенного количества строк.
  2. ">При выборе команды 2 происходит удаление файла.
  3. ">При выборе команды 3 на экран консоли происходит вывод содержимого из файла, а так же при необходимости происходит добавление информации в файл.
  4. ">При выборе команды 4 на экран выводится дата и время создания файла.
  5. ">При выборе команды 5 происходит вывод атрибутов файла.
  6. ">При выборе команды 6 программа завершает свою работу.

">2. Написать программу-таймер. В программе необходимо реализовать несколько режимов работы таймера.

  1. ">При выборе команды 1 отображается режим таймера для отсчета до Нового года.
  2. ">При выборе 1 – отображается полное количество месяцев, дней, часов, минут и секунд, оставшихся до Нового года.
  3. ">При выборе 2 – отображается количество дней, оставшихся до Нового года.
  4. ">При выборе 3 – отображается количество часов, оставшихся до Нового года.
  5. ">При выборе 4 – отображается количество минут, оставшихся до Нового года.
  6. "> При выборе 5 – отображается количество месяцев, оставшихся до Нового года.
  7. ">При выборе 6 – отображается количество секунд, оставшихся до Нового года.
  1. ">При выборе команды 2 отображается оставшееся время до окончания учебной практики. Учебная практика заканчивается 26 декабря в 13:15.
  2. ">При выборе команды 3 отображается оставшееся до конца пары время. Программа должна автоматически определять, какая пара сейчас идет, и выводить оставшееся до звонка время. Если в момент запуска программы идет перемена, то программа должна вывести соответствующее сообщение. Если текущее время до 8:30, то программа выдает сообщение о том, что учебный день еще не начался. Если текущее время больше 13:15, то необходим вывод сообщения, что первая смена уже закончена.
  3. ">При выборе команды 4 программа прекращает работу. Необходимо реализовать программу таким образом, что выход из программы может осуществляться только выбором команды 4.

">Индивидуальное задание:

">Добавить пятый пункт в главное меню. При выборе пункта 5 программа начинает отсчитывать время до Вашего дня рождения.

">3. Добавить к программе 1 навигацию посредством стрелок. Пункты меню должны выбираться перемещением стрелок. Подтверждение выбора осуществляется клавишей " xml:lang="en-US" lang="en-US">

1. Основные компоненты ДОС Всю систему можно разделить на шесть основных частей, функции каж- дой мз которых мы кратко рассмотрим в этом разделе. Первая часть - это система 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 реализует основные услуги ДОС. Это "логический" уровень ввода/вывода операционной системы. Оба эти файла являются "скрытыми" системными файлами. Имена этих файлов не включаются в оглавление диска, вызываемое по команде DIR. Од- на из функций IBMBIO.COM заключается в загрузке еще одного модуля опе- рационой системы. Пятая часть - это дисковый файл COMMAND.COM. Главная функция COMMAND.COM заключается в обработке команд, вводимых пользователем. Ко- манды ДОС, считающиеся внутренними, такие как TYPE, COPY и DIR факти- чески реализуются программами COMMAND.COM. Собственно COMMAND.COM раз- деляется на две части: одна становится частью IBMDOS.COM, а вторая - процессором дополнительных команд. Шестая и последняя часть ДОС состоит из всех внешних команд, таких как FORMAT и DISKCOPY. Функции этих команд различны и реализующие их программы загружаются в память только в случае необходимости. В отличие от остальных пяти частей ДОС, все эти дополнительнве программы не явля- ются интегральной составляющей ДОС, хотя они и поставляются вместе с ней. Некоторые из этих дополнительных программ, например, FORMAT, нас- только важны, что обойтись без них практически невозможно. Внешние команды являются нерезидентными частями ДОС, поскольку они не находятся в памяти постоянно. Файлы IBMBIO.COM, IBMDOS.COM и драйве- ры устойств находятся в памяти постоянно и образуют резидентную часть ДОС. Файл COMMAND.COM можно выделить в отдельную категорию как полу-ре- зидентную составляющую ДОС, о чем речь пойдет ниже. Загрузочная запись используется только временно и поэтому не является резидентной частью ДОС. В следующих шести разделах мы более подробно рассмотрим каждую из частей ДОС. - 2 - 2. Система BIOS в ПЗУ Первая часть в ДОС - это BIOS в ПЗУ или базовая система ввода/вы- вода, размещающаяся в постоянной памяти. Эта система обеспечивает наи- более простые и универсальные услуги операционной системы, связанные с осуществлением ввода/вывода. Система BIOS располагается в ПЗУ начиная с адреса FE00 и до FFFF, сразу же после интепретатора БЕЙСИКа. Поскольку BIOS в ПЗУ является частью IBM/PC, она может изменяться только в том случае, когда изменениям подвергается аппаратная реализа- ция системы. В качестве составной части IBM/PC, система BIOS в ПЗУ яв- ляется не просто одной из частей ДОС, но частью любой операционной сис- темы IBM/PC. Система BIOS в ПЗУ состоит из нескольких частей, большинство из которых представляет собой программы (остальные - это важные таблицы данных, которые мы рассмотрим в последующих главах). Программа системы BIOS, которая выполняется первой, представляет собой тест функциониова- ния. Эта программа поверяет память и внешние устройства, подключенные к IBM/PC, как только будет включено питание компьютера. Работа этой прог- раммы определяет ту задержку, которая имеет место между включением пи- тания и загрузкой операционной системы. Чем больший объем памяти подк- лючен к Вашему компьютеру, тем дольше выполняется тест, поскольку наи- более длительной процедурой является процедура поверки памяти. Следующая часть BIOS, которая должна выполняться как программа за- пуска операционной системы, - это программа вызова загрузчика операци- онной системы. Эта программа проверяет, подключен ли дисковод с гибкими дисками и считывает с дискеты "загрузочную запись". После считывания загрузочной записи программа запуска передает ей управление, чтобы она считала оставшиеся части операционной системы. Если в системе нет дисковода или при считывании загрузочной записи произошла ошибка, то программа запуска BIOS передает управление кассет- ной системе БЕЙСИК. Если Вы включите IBM/PC, не установив дискету в дисковод, то Вы увидите, что начала работу программа системы БЕЙСИКа. Помимо двух уже описанных частей - автономного теста функцонирова- ния и программы запуска, система BIOS в ПЗУ содержит множество других программ и они-то представляют для нас наибольший интерес. Сюда входят программы обслуживания всего стандартного периферийного оборудования IBM/PC. Эти программы выполняют основные функции управления клавиату- рой, дисплеем, дискетами, асинхронным адаптером связи, устройством пе- чати и кассетным интерфейсом. Работой с этими программами нам необходи- мо овладеть, чтобы полностью использовать все возможности IBM/PC. 3. Начальная загрузка - загрузочная запись Загрузочная запись необходима для запуска ДОС. Принцип использова- ния загрузочной записи реализован практически на всех компьютерах. Заг- рузочная запись содержит минимум необходимых команд для считывания и запуска основных частей операционной системы. При запуске IBM/PC либо включением питания, либо нажатием клавиш Ctrl-Alt-Del, процедура запуска системы BIOS в ПЗУ считывает первую за- пись дискеты, установленной в дисковод А и помещает ее в стандартную область памяти, по адресу 31744 или 7С00 (шестнадцатиричное). После считывания загрузочной записи BIOS передает ей управление, выполняя пе- реход по адресу 31744. Далее загрузочная запись должна продолжить заг- рузку операционной системы. Основное назначение загрузочной записи для ДОС заключается просто в загрузке файлов IBMBIO.COM и IBMDOS.COM. Загрузочная запись имет раз- мер стандартного сектора на дискете, 512 байт, что недостаточно для сложной программы. Для упрощения работы этой программы, оба файла, - 3 - IBMBIO.COM и IBMDOS.COM, размещаются в определенных постоянных местах на дискете. Это избавляет программу загрузки от необходимости искать их в справочнике дискеты. Этим, кстати, "системная" дискета отличается от обычной - на ней, в определенных местах, находятся два системных файла IBMDOS.COM и IBMBIO.COM. Поэтому нельзя просто преобразовать обычную дискету в сис- темную - места, зарезервированные для системных файлов, могут быть за- няты другими файлами. Хотя загрузочная программа не столь совершенна, чтобы осуществлять поиск системных файлов, она все же способна проверить правильность их включения в справочник. Поскольку оба системных файла включены в спра- вочник дискеты, они защищены как от стирания, так и от любых других способов доступа установлением атрибутов скрытого и системного файла. (В следующей главе мы поясним, что такое скрытые и системные файлы). В связи с простотой ее задачи, программа загрузки является относительно стабильной составной частью ДОС. Ее потребовалось изменить, когда изменялся размер или местоположение системных файлов, а это произошло с введением поддержки двухсторонних дискет в версии ДОС 1.10. 4. IBMBIO.COM Первый из двух системных файлов, IBMBIO.COM, предназначен для до- полнения функций системы BIOS в ПЗУ. Как BIOS в ПЗУ, так и IBMBIO.COM занимаются обслуживанием операций ввода/вывода или обслуживанием уст- ройств, что то же самое. Такая функция предполагает обработку различных подробностей, связанных с функционированием устройств ввода/вывода. Сю- да же включается обнаружение ошибок и их исправление, что для программ еще сложнее. Программы IBMBIO.COM отличаются тем, что их легко можно изменить, чего нельзя сказать о программах BIOS в ПЗУ. Файл IBMBIO.COM предназна- чен для решения трех задач, которые невозможно решить с помощью системы BIOS в ПЗУ. Первая задача заключается в настройке на нужды конкретной операционной системы, ДОС. Вторая задача IBMBIO.COM заключается в исправлении любых ошибок в BIOS в ПЗУ, если в этом возникнет необходимость. Программы, подобные системе BIOS, проверяются очень тщательно, ведь их размещение в ПЗУ не допускает исправлений. Если ошибки все же будут позднее обнаружены в BIOS, их можно будет исправить путем внесения соответствующих изменений в IBMBIO.COM. Это делается путем изменения векторов прерываний таким образом, чтобы управление при обращении к операциям BIOS сначала попа- дало в IBMBIO.COM, а уже затем в BIOS. Соглашения о вызовах процедур системы BIOS в ПЗУ всегда предполагает использование прерываний, вместо прямых переходов по адресам ПЗУ. Основная причина использования преры- ваний как раз и состоит в обеспечении возможностей перехвата управления у процедур BIOS, ведь, в противном случае, такой возможности просто не существовало бы. Третья задача, которую не позволяет решить BIOS, и, которую за нее решает IBMBIO.COM, заключается в обслуживании новых периферийных уст- ройств, таких как жесткие диски большой емкости, или восьмидюймовые (203мм) дискеты, или плоттеры, или любые из сотен устройств, которые могут быть подключены к IBM/PC. Когда новое устройство ввода/вывода подключается к IBM/PC, обслуживающая его программа должна включаться в файл IBMBIO.COM или его расширения, без необходимости замены микросхем ПЗУ, в которых размещается система BIOS. В наиболее ранних версиях ДОС задача включения нового устройства в систему предполагала внесение изменений в IBMBIO.COM и, возможно, в другие системные программы ДОС. Хотя это не слишком сложно для таких фирм как "ИБМ" или "Майкрософт", такая задача может оказаться непосиль- - 4 - ной для пользователя, которому требуется включить дополнительное обору- дование в свою систему. Поскольку возможность добавления новых устройств к компьютеру сос- тавляет немаловажное условие его успеха на рынке, процедура включения обслуживающих программ в ДОС была упрощена, начиная с ДОС версии 2.00. Когда управление впервые после запуска системы передается IBMBIO.COM, он проверяет, находится ли на дискете файл конфигурации системы. Если файл конфигурации найден, считываются его команды, часть которых опре- деляет ряд параметров системы. Команды файла конфигурации включают имена всех программ обслужива- ния устройств, которые необходимо включить в BIOS. Каждая из этих прог- рамм загружается в память как дополнение к IBMBIO.COM. Такая схема об- легчает добавление новых устройств, позволяет делать это модульно, не затрагивая системные файлы ДОС. Как правило, любая программа, работающая на IBM/PC, будет исполь- зовать обычную версию BIOS для ДОС. Однако, в некоторых случаях прог- рамме необходимо бывает особое обслуживание операций ввода/вывода. Пос- кольку IBMBIO.COM представляет собой дисковый файл, который можно изме- нить, имеет смысл разработать версию IBMBIO.COM, настроенную на Ваши конкретные нужды. Пример такой настройки Вы можете найти в диагности- ческих программах. 5. IBMDOS.COM Разделение операционной системы на два модуля, IBMBIO.COM и IBMDOS.COM позволяет разделить те части, которые специфичны для конк- ретного компьютера и те, которые являются общими для всех компьютеров, работающих под управлением ДОС. Служебные процедуры ДОС, в определенной степени произвольно, раз- делены на те, которые вызываются с помощью собственных прерываний, и те, которые разделяют общее прерывание (номер 33, шестнадцатиричное значение 21). В терминологии ДОС, первая группа называется прерываниями ДОС, а вторая - вызовами функций. В обоих случаях для их вызова исполь- зуются программные прерывания, причем по той же причине, что и для вы- зова программ BIOS: для обеспечения модульности. Диапазон прерываний от 32 до 63 (шестнадцатиричные значения от 20 до 3F) зарезервированы для использования ДОС. Используется только часть этих прерываний, а остальные обеспечивают возможность дальнейшего рас- ширения. Программы обслуживания прерываний ДОС включают чтение и запись секторов дискеты, доступ к контролю за ошибками ДОС и операциями клави- атуры Ctrl-Break. Вызовы функций ДОС обеспечивают, в основном, промежуточный уровень обслуживания операций ввода/вывода. В качестве примеров можно упомянуть ввод с клавиатуры, обычный вывод на экран дисплея, ввод/вывод по асинх- ронной линии связи и вывод на печать. Предусмотрены также логические операции для дискет - открытие и закрытие файлов, поиск в справочнике файлов, удаление и создание файлов, чтение и запись данных. Эти проце- дуры обеспечивают практически все элементарные операции, которые могут потребоваться программе для работы с файлами и данными, хранящимися в файле, так чтобы программе не приходилось самостоятельно расшифровывать данные справочников, таблиц размещения файлов и т.п. Большая часть этих служебных процедур ДОС интенсивно используется программами более высокого уровня ДОС. Например, процедура поиска в справочнике используется командами DIR и COPY. Кроме того, она исполь- зуется интерпретатором команд для поиска программных файлов. В разделе 4.9 будет рассмотрен полный список служебных процедур ДОС. 6. Файл COMMAND.COM и внутренние команды - 5 - Следующая составная часть ДОС, файл 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 находит программный файл в любом формате, он выполняет загрузку этого файла в память и выполняет любое необходимое преобразование. После загрузки файла и формирования приставки программного сегмента, COMMAND.COM передает управление этой программе, так чтобы она могла выполнить свою работу. Если файл обработки команды относится к типу ".BAT", то есть явля- ется файлом пакетной обработки, то он содержит в формате текстового файла в коде ASCII последовательность команд, которые должны выполнять- ся так, как будто они вводятся с клавиатуры. Одна из многих задач COMMAND.COM заключается в отслеживании позиции в файле пакетной обра- ботки, так чтобы после выполнения одной команды сразу переходить к дру- гой. Если в процессе обработки одного пакетного файла будет вызван дру- гой, то возврата к первому не произойдет, так как файлы пакетной обра- ботки не могут быть вложенными, зато их можно объединять в цепочку. В некоторых системах весь ввод команд может быть переназначен на файл, причем это относится как к программам, вводящим данные с клавиа- туры, так и к интерпретатору команд. К ДОС это не относится. Только ин- терпретатор команд COMMAND.COM может автоматически выполнять чтение из файлов пакетной обработки. Кстати, программы могут вносить изменения в файл пакетной обработ- ки и таким образом определять, какая команда будет выполнена следующей. Это часто делается в сложных приложениях для замены последовательного выполнения программ. Командный процессор, COMMAND.COM состоит из трех отдельных частей: 1. Резидентной части, размещаемой в ОЗУ непосредственно за IBMDOS.COM и ее рабочей областью. Эта часть содержит подпрограммы обра- ботки прерываний 22H (адрес завершения), 23H (реакция на Ctrl-Break) и 24H (реакция на фатальную ошибку), а также подпрограмму подзагрузки не- резидентных частей. (При завершении программы вычисляется контрольная сумма области нерезидентной части командного процессора, и выясняется, не затерта ли она. Если да, то нерезидентная часть подзагружается). За- метим, что вся стандартная обработка ошибок производится этой частью COMMAND.COM. Это включает выдачу сообщений об ошибках и обработку отве- та на вопрос "Abort, Retry or Ignore". - Часть инициализации располагается в памяти вслед за резидентом и - 6 - получает управление при запуске системы. Эта часть включает обработку файла AUTOEXEC.BAT. Она также определяет адрес, начиная с которого мо- гут загружаться программы. Эта часть перекрывается первой же програм- мой, загружаемой COMMAND, так как не используется после выполнения ини- циализации. - Нерезидентые части загружаются в конец (старшие адреса) ОЗУ. Их две: собственно командный процессор (часть 3), выполняющий обработку диалогjds[ команд и из командных файлов, и (часть 4) загрузчик, загру- жающий и выполняющий нерезидентные команды (т.е. файлы с расширениями.COM или.EXE). Загрузчик располагается в самом конце ОЗУ и вызsвается операцией вызова и загрузки прогамм (Exec). Часть 3 COMMAND выдает приглашение (напр. A>), принимает команды с клавиатуры (или из командного файла) и начинает их выполнение. Для не- резидентных команд она формирует командную строку и выполняет операцию Exec для загрузки и вызова соответствующей программы. 7. Внешние команды Последнюю часть операционной системы ДОС составляют внешние коман- ды. Они называются внешними, поскольку они не включены в состав ДОС, и не являются резидентными в памяти IBM/PC. Вместо этого, внешние команды хранятся в программных файлах на дискетах. Как все программные файлы, все внешние команды имеют расширение имени файла ".COM" или ".EXE", что указывает, в каком из форматов они оформлены. Мы рассмотрим эти форматы, когда будем рассматривать струк- туру дискет и файлов в следующей главе. Примерами внешних команд могут служить DISKCOPY, COMP, FORMAT, а такие программы как EDLIN, BASIC или BASICA тоже в определенном смысле являются внешними командами, хотя их лучше все же считать языковыми процессорами, такими как макроассемблер или Паскаль. Внешние команды не отличаются от других программных файлов, кото- рые Вы сами разрабатываете или покупаете. С одной точки зрения внешние команды действительно являются частью операционной системы, особенно те, без которых операционной системой нельзя воспользоваться, такие как FORMAT. Однако, с другой точки зрения, внешние команды - это всего лишь вспомогательные программы, утилиты, которые полезны, но которые не яв- ляются операционной системой. Разница между внешней командой ДОС и обычной программой заключается просто в Вашем отношении к ней - как к части ДОС или как к чему-нибудь малосущественному. 8. Инициализация DOS При запуске системы (либо операцией перезагрузки системы), либо при включении питания с системной дискетой в устройстве A:), блок на- чальной загрузки считывается в память и получает управление. Он прос- матривает каталог, чтобы убедиться, что первые два файла суть IBMBIO.COM и IBMDOS.COM (в указанном порядке). Если эти файлы не обна- ружены, на экран выдается сообщение об ошибке, иначе оба файла считыва- ются в оперативную память. (IBMBIO.COM должен быть первым файлом в кор- невом каталоге и располагаться на последовательных секторах). Подпрограмма инициализации в IBMBIO.COM определяет состояние обру- дования, инициализирует дисковую систему и подключенные устройства, загружает драйверы устройств, и устанавливает значения младших вектров прерываний. Затем она выполняет настройку адресов в IBMDOS.COM и пере- дает управление на первый байт DOS. Так же как и в IBMBIO.COM, первый байт DOS содержит переход на подпрограмму инициализации, которая после выполнения перекрывается об- ластью данных командного процессора. DOS инициализирует свои внутренние - 7 - рабочие таблицы, инициализирует вектора прерываний 20-27 и формирует Префикс Программного Сегмента (См. Гл. 6) для COMMAND.COM в самом млад- шем доступном сегменте; затем она возвращается в IBMBIO.COM. Последнее инициализационное действие IBMBIO.COM заключается в заг- рузке COMMAND.COM по адресу, установленному подпрограммой инициализации DOS. Затем IBMBIO.COM передает управление на первый байт COMMAND.

Модули.

Описание модулей.

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

Модуль состоит из заголовка, интерфейсной части , исполнительной части и секции инициализации .

Заголовок модуля похож на заголовок программы, однако вместо слова program ставится зарезервированное слово unit.

Модуль должен находится в файле, имя которого совпадает с именем в заголовке, файл должен иметь расширение .pas .

Интерфейсная часть служит для взаимодействия основной программы с модулем. Она начинается с зарезервированного слова interface. В ней должны быть указаны константы, типы данных, переменные, процедуры и функции, которые может использовать основная программа, вызывающая этот модуль. Если модуль использует еще какие-то модули, то они должны быть указаны в интерфейсной части следующим образом: пишется зарезервированное слово uses, затем перечисляются необходимые модули (заметим, что так же обозначаются и модули в разделе описания основной программы). Цепочка используемых модулей может быть сколь угодно длинной, однако она не может содержать циклы. Например, допустима цепочка:

А цепочка

недопустима, поскольку она содержит цикл A uses B uses A.

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

В исполнительной части модуля содержаться процедуры и функции модуля. Здесь могут быть так же и локальные типы, константы, метки или переменные. Исполнительная часть начинается с зарезервированного слова implementation, далее следует описания локальных констант, типов данных и переменных, а затем обычное описание процедур и функций, но с использованием сокращенных заголовков, т.е. без указания в них параметров.

Иногда при вызове модуля следует произвести некоторые действия, например инициализировать какие-либо переменные, установить какие-либо связи и т.д. Все эти действия указываются в секции инициализации , которая выглядит, как обычное тело программы: между словами begin и end с точкой находятся операторы. Если при вызове модуля никаких подобных действий производить не нужно, то секция инициализации состоит лишь из слова end с точкой.

Чтобы использовать процедуры, функции и другие объекты модуля в основной программе, необходимо написать зарезервированное слово uses, затем имя модуля. После этого объекты модуля можно использовать так, как если бы они были описаны в основной программе.

Рассмотрим теперь модули, которые поставляются в стандартном комплексе Turbo Pascal, но функции и процедуры которых не являются стандартными.

Модуль CRT.

Модуль Crt содержит процедуры, функции и константы для работы с экраном в текстовом режиме, работы с клавиатурой и генерации звука.

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

В текстовом режиме весь экран разбивается на строки (их, как правило, 25), а каждая строка - на отдельные позиции (их обычно по 80 в каждой строке) находится в левом верхнем углу экрана.

Модуль DOS.

Здесь собраны процедуры и функции (а также переменные и константы), позволяющие из программ получать доступ к средствам MS DOS и управлять файлами.

Модуль GRAPH.

Содержит множество подпрограмм, а также констант, типов и переменных, предназначенных для управления графическим режимом экрана. Ресурсы модуля позволяют обратится к любому пикселю экрана и управлять его свечением.

Запустить программу, использующую модуль GRAPH, без графического драйвера (одного или нескольких - это файла с расширением.BGI) не удастся. Указанные драйверы не входят в состав модуля, но поставляются с Turbo Pascal (они содержаться в каталоге BGI). А если в программе используются векторные шрифты, в дополнение е драйверам потребуются также файлы шрифтов (файлы с расширением.CHR).



Рекомендуем почитать

Наверх