- •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 3Eh — Закрыть файл
Ввод: АН = 3Eh
ВХ = идентификатор
Вывод: CF = 0, если не произошла ошибка
CF = 1 и АХ = 6, если неправильный идентификатор
Если файл был открыт для записи, все файловые буфера сбрасываются на диск, устанавливается время модификации файла и записывается его новая длина.
Функция DOS 41h — Удаление файла
Ввод: АН = 41h
DS:DX = адрес ASCIZ-строки с полным именем файла
Вывод: CF = 0, если файл удален
CF = 1 и АН = 02h, если файл не найден, 03h, если путь не найден, 05h, если доступ запрещен.
Удалять файл следует только после того, как он будет закрыт, иначе DOS будет продолжать выполнять запись в несуществующий файл, что может привести к разрушению файловой системы. Функция 41h не позволяет использовать маски (символы «*» и «?» в имени файла) для удаления сразу нескольких файлов, хотя этого можно добиться, вызывая ее через недокументированную функцию 5D00h. Официальная функция удаления файла, позволяющая удаление сразу нескольких файлов, появилась в системе DOS 7.0 (Windows 95):
Функция LFN 41h — Удаление файлов с длинными именами
Ввод: AX = 7141h
DS:DX = адрес ASCIZ-строки с длинным именем файла
SI = 0000h: маски не разрешены и атрибуты в СХ игнорируются
SI = 000lh: маски в имени файла и атрибуты в СХ разрешены:
CL = атрибуты, которые файлы могут иметь
СН = атрибуты, которые файлы должны иметь
Вывод: CF = 0, если файл или файлы удалены
CF = 1 и АХ = код ошибки, если произошла ошибка. Код 7100h означает, что функция не поддерживается.
Ниже приведен пример простой программы, иллюстрирующей использование файловых функций. Осуществляются создание файла в текущем каталоге, запись в него текстовой строки и закрытие файла. (В простых программах, подобных этой, явное закрытие файла можно не производить, так функция 4Ch автоматически закрывает все открытые файлы перед возвратом управления операционной системе).
dat segment
fname db '1.txt', 0 ; ASCIIZ-имя файла
string db 'Данные' ; записываемая строка
len = $-string ; длина строки
ermes db 'Ошибка создания файла!'
erLen = $-ermes ; длина сообщения об ошибке
dat ends
cod segment
assume cs:cod,ds:dat
b: mov ax, dat
mov ds, ax ; инициализация DS адресом сегмента данных
;Создадим файл
mov ah, 3Ch ; функция ’Создать файл’
lea dx, fname ; DS:DX -> ASCIIZ-имя
xor cx,cx ; без атрибутов
int 21h
jc er ; если ошибка – на обработку
;Запишем в файл строку
mov bx, ax ; сохраним дескриптор созданного файла
mov ah, 40h ; функция записи в файл или на устройство
lea dx, string ; DS:DX -> записываемая строка
mov cx, len
int 21h
;Закроем файл (в BX - дескриптор)
mov ah, 3Eh
int 21h
exit: mov ax, 4c00h
int 21h
;Обработка ошибки создания файла – вывод сообщения
er: mov ah, 40h ; функция записи в файл или на устройство
mov bx, 1 ; дескриптор, соответствующий экрану
lea dx, ermes ; DS:DX -> сообщение об ошибке
mov cx, erLen ; его длина в байтах
int 21h
jmp exit
cod ends
end b