- •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
- •Литература
Программа типа ехе
ЕХЕ-программы имеют более сложную структуру, но благодаря этому для них отсутствует ограничение размера в 64 Кб, и поэтому все достаточно большие программы оформляются именно в этом формате. ЕХЕ-программа может содержать произвольное число сегментов, хотя доступ в каждый момент времени возможен лишь к четырем (или шести для 80386) из них; для использования остальных необходима перенастройка сегментных регистров.
Исходный текст программы ЕХЕ (так же, как и программы СОМ) может быть описан с использованием моделей памяти либо с помощью директив сегментации и директивы ASSUME. Ниже приведены примеры описаний для первого и второго вариантов соответственно.
.model small ; модель памяти, используемая для ЕХЕ-программ
.stack 100h ; сегмент стека размером 256 байт
.code ; начало сегмента кода
start: ; точка входа
mov ax, DGROUP ; сегментный адрес данных
mov ds, ax ; помещается в DS
[. . .] ; (содержательная часть)
mov ah, 4Ch
int 21h ; вызов функции DOS Exit («завершить программу»)
.data ; конец сегмента кода и начало сегмента данных
message db 1, 2, 3, 'data'
end start ; конец сегмента данных и программы
В этом примере определяются три сегмента — сегмент стека директивой .STACK размером в 256 байт, сегмент кода, начинающийся с директивы .CODE, и сегмент данных, начинающийся с .DATA и содержащий данные. Порядок сегментов в большинстве случаев может быть произвольным.
Команда MOV AX,DGROUP загружает в АХ сегментный адрес группы сегментов данных DGROUP, a MOV DS,AX копирует его в DS. Для ассемблеров MASM и TASM можно использовать вместо DGROUP предопределенную метку “@data”, но единственная модель памяти, в которой группа сегментов данных называется иначе,— FLAT (используемая реже остальных).
Сразу же за командами настройки регистра DS идет вызов функции Exit выхода из программы.
Компиляция name.asm:
Для TASM:
tasm name.asm
tlink /x name.obj
Для MASM:
ml /c name.asm
1.2.Использование служебных функций dos и bios
Одним из основных средств, имеющихся в распоряжении системного программиста, является набор служебных подпрограмм базовой системы ввода-вывода (BIOS) и операционной системы (ОС). Их использование избавляет от необходимости настраиваться на работу каждого конкретного устройства, разрабатывать каждый раз заново служебные базовые процедуры и, поскольку эти подпрограммы являются стандартными, повышает совместимость программ.
В DOS доступ к служебным подпрограммам (их называют функциями) осуществляется с помощью программных прерываний, вызываемых по команде INT. В качестве операнда этой команды указывается номер прерывания. Всего имеется 256 номеров, часть из них не используется. Подпрограмм значительно больше, поэтому их группируют и назначают номер прерывания целой группе. При вызове прерывания уточняют, к какой подпрограмме нужно обратиться. Чаще всего для этого используют регистр AH — в него заносят непосредственно перед вызовом прерывания номер функции. Пример вызова 1-й функции прерывания 21h:
mov ah, 01h
int 21h
В результате выполнения команды INT управление передается программе обработки соответствующего прерывания (в данном случае 21h); по окончании работы управление возвращается в прерванную программу.
Многие функции нуждаются в определенных входных данных (параметрах), определяющих результат их работы. Входные параметры чаще всего передаются через регистры и/или ячейки памяти. Адреса входных ячеек памяти обычно также передаются через регистры.
Функция может возвращать в прерванную программу определенный результат — в выходных регистрах или ячейках памяти. Таким образом, в общем случае процедуру вызова N‑й функции прерывания X можно записать так:
;заполнение входных регистров (ячеек памяти)
mov ah, N ; AH = номер функции
int X ; вызов прерывания X
;анализ выходных регистров (ячеек памяти)
Часть номеров прерывания закреплена за функциями BIOS, часть — за функциями DOS, а несколько могут быть использованы программистом для собственных подпрограмм (функций).
Как уже отмечалось, доступ к большинству функций DOS осуществляется через прерывание 21h. Среди них — функции для ввода с клавиатуры и вывода на экран, функции работы с файлами, управления памятью и процессами и другие. Информацию о номерах функций и прерываний, входных и выходных регистрах, а также описание действия функций можно найти в справочниках по DOS. Кроме того, многие из них рассматриваются далее.
Выше мы уже сталкивались с использованием одной из функций DOS — функции выхода из программы (4Ch — Exit). Отличие данной функции от большинства других заключается в том, что она не возвращает управление вызвавшей ее программе. Управление передается вызвавшей программу среде (командному процессору, оболочке или какой-либо другой родительской программе). При вызове функции входной регистр AL содержит код возврата, который может быть проверен вызвавшей средой. Нулевой код возврата традиционно считается признаком успешного завершения. В соответствии с этими сведениями, более корректный вариант вызова функции выхода предусматривает явное определение кода возврата, например:
mov ah, 4Ch ; функция DOS 4Ch завершения программы
mov al, 00h ; код 0 успешного завершения
int 21h ; вызов DOS
либо
mov ax, 4C00h ; номер функции и код возврата
int 21h ; вызов DOS