- •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
- •Литература
2.4.Резидентные программы
Системные средства организации резидентных программ
Программы, остающиеся в памяти, после того как управление возвращается в DOS, называются резидентными (TSR — Terminate and Stay Resident). Превратить программу в резидентную просто — достаточно вызвать специальную системную функцию DOS ("Keep"):
Функция DOS 31h — Оставить программу резидентной
Ввод: АН = 31h
AL = код возврата
DX = размер резидента в 16-байтных параграфах (больше 06h), считая от начала PSP.
Кроме того, существует и иногда используется предыдущая версия этой функции — прерывание 27h:
INT 27h — Оставить программу резидентной
Ввод: АН = 27h
DX = адрес последнего байта программы (считая от начала PSP) + 1
Прерывание 27h не может оставлять резидентными программы размером больше 64 Кб, но многие программы, написанные на ассемблере, соответствуют этому условию. Так как резидентные программы уменьшают объем основной памяти, их всегда пишут на ассемблере и оптимизируют для достижения минимального размера.
Никогда не известно, по каким адресам в памяти оказываются загруженные в разное время резидентные программы, поэтому единственным несложным способом получения управления является механизм программных и аппаратных прерываний. Принято разделять резидентные программы на активные и пассивные, в зависимости от того, перехватывают ли они прерывания от внешних устройств или получают управление, только если программа специально вызовет команду INT с нужным номером прерывания и параметрами.
Независимо от этого типичная структура резидентной программы выглядит следующим образом:
code segment
assume CS:code, DS:code
org 100h ; СОМ-программа
main proc
jmp init ; переход на секцию инициализации
[. . .] ; данные резидентной секции программы
entry: ; точка входа при активизации
[. . .] ; текст резидентной секции программы
main endp
ressize = $-myproc ; размер (в байтах) резидентной секции
init proc ; секция инициализации
[. . .]
mov DX,(ressize+10Fh)/16 ; размер в параграфах
mov AX, 3100h ; функция "завершить и оставить в памяти"
int 21h
init endp
code ends
end main
Программа имеет две точки входа — main и entry. При первом запуске программы с клавиатуры управление передается на начало процедуры main. Командой JMP осуществляется переход на секцию инициализации, в которой, в частности, подготавливаются условия для дальнейшей активизации программы уже в резидентном состоянии. Последними строками инициализации вызывается функция 31h, выполняющая завершение программы с оставлением в памяти указанной ее части. С целью экономии памяти секция инициализации располагается в конце программы и отбрасывается при ее завершении. Действия, выполняемые секцией инициализации, называются установкой резидентной программы в памяти.
Содержательная часть программы начинается с метки entry и должна заканчиваться командой IRET.
Реальные резидентные программы, как правило, перехватывают целый ряд аппаратных и программных прерываний и имеют, соответственно, несколько точек входов активизации.
Реже резидентная часть активизируется командой CALL, тогда, разумеется, для окончания работы используется команда RET. Иногда требуется вмешательство в процесс передачи управления между процессами на уровне обычных переходов.
Имеется также класс так называемых полурезидентных программ, которые загружают и выполняют другую программу, оставаясь при этом в памяти, а после того, как загруженная программа заканчивается, также завершаются обычным образом. По сути, это обыкновенные родительские программы, порождающие дочерние. Однако они могут содержать обработчики прерываний, которые действуют все время, пока работает дочерняя программа, поэтому для дочерней программы полурезидентная программа функционирует как обычная резидентная.