- •1. Основы программирования для dos 9
- •1.1.7. Средства bios 21
- •2. Приемы системного программирования 57
- •Введение
- •1.Основы программирования для dos
- •1.1. Структура и выполнение программ в dos
- •Программа типа сом
- •Программа типа ехе
- •1.2.Использование служебных функций dos и bios
- •1.3.Вывод на экран в текстовом режиме
- •Средства dos
- •Средства bios
- •Выбор видеорежима
- •Управление положением курсора
- •Вывод символов на экран
- •Прямая работа с видеопамятью
- •1.4.Ввод с клавиатуры
- •Средства dos
- •Средства bios
- •1.5.Графические видеорежимы
- •Работа со стандартными графическими режимами
- •Работа с svga-режимами
- •(Продолжение таблицы 4)
- •(Окончание таблицы 4)
- •1.6.Работа с мышью
- •1.7.Другие устройства
- •Системный таймер
- •Последовательный порт
- •Параллельный порт
- •1.8.Работа с файлами
- •Создание и открытие файлов
- •Чтение из файла и запись в файл
- •Закрытие и удаление файла
- •Поиск файлов
- •Управление файловой системой
- •1.9.Управление памятью
- •Обычная память
- •Область памяти umв
- •Область памяти нма
- •Интерфейс ems
- •Интерфейс xms
- •1.10.Организация процессов
- •Запуск программ на выполнение
- •Переменные окружения
- •Командные параметры
- •2.Приемы системного программирования
- •2.1.Управляющие структуры
- •Структуры if... Then... Else
- •Структуры case
- •Конечные автоматы
- •2.2.Процедуры и функции
- •Передача параметров
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Локальные переменные
- •2.3.Обработка прерываний
- •Обработчики прерываний
- •Прерывания от внешних устройств
- •Взаимодействие прикладных и системных обработчиков прерываний
- •2.4.Резидентные программы
- •Системные средства организации резидентных программ
- •Взаимодействие с резидентной программой
- •2.5.Драйверы устройств в dos
- •Литература
1.Основы программирования для dos
1.1. Структура и выполнение программ в dos
Любая программа, на каком бы языке она ни была написана, выполняется не сама по себе, а при помощи операционной системы (ОС). ОС выделяет области памяти для программы, загружает ее, передает ей управление и обеспечивает взаимодействие программы с устройствами ввода-вывода, файловыми системами и другими программами (разумеется, кроме тех случаев, когда эта программа сама является операционной системой или ее частью). Способы взаимодействия программы с внешним миром различны для разных ОС, и поэтому программы могут выполняться лишь в среде той ОС, для которой они были написаны и подготовлены к выполнению.
DOS является однозадачной однопользовательской ОС, то есть рассчитана на обслуживание единственного пользователя и выполнение единственной программы в каждый момент времени.
DOS предоставляет программисту набор сервисных подпрограмм, называемых функциями. Доступ к функциям осуществляется при помощи программных прерываний, т. е. посредством команды INT микропроцессора. Механизм обращения к функциям рассматривается ниже.
Как уже говорилось в первой части курса, создание выполнимой программы состоит из нескольких этапов: подготовки исходного текста в определенном формате, трансляции исходного текста и компоновке полученного объектного модуля (или нескольких модулей) в один исполнимый файл. В DOS используется два формата исполнимых файлов — СОМ и ЕХЕ. Файлы типа СОМ содержат только скомпилированный код без какой-либо дополнительной информации о программе. Весь программный код, данные и стек такой программы располагаются в одном сегменте и не могут превышать 64 Кб. Файлы типа ЕХЕ содержат заголовок, в котором описывается размер файла, требуемый объем памяти, список команд в программе, использующих абсолютные адреса, которые не зависят от расположения программы в памяти, и т. д. ЕХЕ-файл может иметь любой размер (точнее, размер ограничивается только параметрами файловой системы).
Кроме обычных исполнимых программ DOS может загружать драйверы устройств — специальные программы, используемые для упрощения доступа к внешним устройствам. К таким драйверам, например, относятся драйверы системных устройств CON, PRN, NUL и других (помещаются в память при загрузке системы), драйвер виртуального диска RAMDRIVE.SYS, драйвер расширения возможностей вывода в текстовом режиме ANSI.SYS и др. (могут загружаться с помощью конфигурационного файла CONFIG.SYS). Написание драйверов значительно сложнее, чем написание обычных программ (см. раздел 2.5).
DOS имеет также внутренние команды, которые можно выполнять без наличия одноименного файла на диске, так как они входят в состав командного процессора ОС. К ним относятся, например, команды COPY, DIR, DEL, TYPE и др.
После окончания загрузки ядра ОС в память управление берет на себя командный процессор (интерпретатор) COMMAND.COM. Он следит за вводимыми пользователем командами и выполняет их, то есть запускает на выполнение программы. Запуск обычно заключается в размещении программы в памяти (с необходимой настройкой для ЕХЕ-программ) и передаче управления на входную точку программы. Таким образом командный процессор инициирует дочерний по отношению к себе процесс. Запуск осуществляется специальной функцией Exec, входящей в состав командного процессора.
После того, как программа завершила работу, она должна вернуть управление родительскому процессу, т. е. командному процессору. Для этого DOS также имеет соответствующую функцию (Exit). При этом дочерняя программа может передать родительскому процессу код завершения, по которому можно судить о причине завершения программы.
В результате выполнения функции Exit занимаемая программой память освобождается, после чего управление возвращается родительскому процессу. В DOS, однако, имеется и другой вариант завершения работы программы — TSR (Terminate and Stay Resident), при котором управление передается родительской среде, но занятая программой память не освобождается. В результате программа остается в памяти резидентно в пассивном состоянии, но может быть определенным образом активизирована (то есть снова получить управление).