- •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
- •Литература
Чтение из файла и запись в файл
Выше указывалось, что на уровне функций DOS нет различий между файлом или драйвером устройства ввода-вывода (экрана, клавиатуры, принтера или виртуального диска в памяти). Указание реального приемника данных производится при помощи 16-битового идентификатора, представляющего собой порядковый номер устройства. Переназначение идентификатора, то есть установление его соответствия с другим приемником данных, позволяет перенаправить поток данных на другое устройство. Переназначение выполняется специальной функцией DOS 46h или с помощью операторов перенаправления ввода-вывода.
Функция DOS 3Fh — Чтение из файла или устройства
Ввод: AH = 3Fh
BX = идентификатор
CX = число байт
DS:DX = адрес буфера для приема данных
Вывод: CF = 0 и АХ = число считанных байт, если не произошла ошибка; иначе:
CF = 1 и АХ = код ошибки (05h или 06h)
Если при чтении из файла число фактически считанных байт в АХ меньше, чем заказанное число в СХ, при чтении был достигнут конец файла.
Каждая следующая операция чтения, так же как и записи, начинается не с начала файла, а с того байта, на котором остановилась предыдущая операция чтения/записи. Это происходит благодаря поддержке операционной системой специальной переменной, называемой указателем файла. По мере обработки файла указатель смещается к следующим байтам. Функция DOS 42h позволяет задавать относительное или абсолютное положение указателя в файле и, таким образом, обеспечивать доступ к произвольному участку файла.
Функция DOS 42h — Переместить указатель чтения/записи
Ввод: АН = 42h
ВХ = идентификатор
CX:DX = расстояние, на которое надо переместить указатель (со знаком)
AL = перемещение относительно: 0 — начала файла; 1 — текущей позиции; 2 — конца файла
Вывод: CF = 0 и CX:DX = новое значение указателя (в байтах от начала файла), если не произошла ошибка; в противном случае:
CF = 1 и АХ = 06h (неправильный идентификатор)
Указатель можно установить за реальными пределами файла: если указатель представляет собой отрицательное число, следующая операция чтения/записи вызовет ошибку; если указатель представляет собой положительное число, большее длины файла, следующая операция записи увеличит размер файла. Эта функция также часто используется для определения длины файла — достаточно вызвать ее с СХ = 0, DX = 0, AL = 2, и в CX:DX будет возвращена длина файла в байтах.
Функция DOS 40h — Запись в файл или устройство
Ввод: АН = 40h
ВХ = идентификатор
СХ = число байт
DS:DX = адрес буфера с данными
Вывод: CF = 0 и АХ = число записанных байт, если не произошла ошибка; иначе:
CF = 1 и АХ = код ошибки (05h или 06h)
Если при записи в файл указать СХ = 0, файл будет обрезан по текущему значению указателя.
Выше говорилось о буферизации потоков данных между программой и файлом. При записи в файл вначале происходит запись в буфер DOS, а уже в файл на диске данные попадают либо при закрытии файла, либо если их количество превышает размер сектора диска. Для немедленного сброса (выгрузки) буфера можно использовать функцию 68h.
Функция DOS 68h — Сброс файловых буферов DOS на диск
Ввод: АН = 68h
ВХ = идентификатор
Вывод: CF = 0, если операция выполнена
CF = 1, если произошла ошибка (АХ = код ошибки)
А для критических участков программ можно использовать более эффективную функцию 0Dh.
Функция DOS 0Dh — Сброс всех файловых буферов на диск
Ввод: АН = 0Dh
Вывод: никакого