MS-DOS предоставляет две функции 35h и 25h прерывания 21h для чтения и установки вектора прерывания.
Функция 35h – выполняет чтение адреса подпрограммы обработки прерывания. Вызов:
ah = 35h
al = номер прерывания
Возвращаемое значение:
Es:bx – указатель на подпрограмму прерывания
Примечание. Функция получает адрес, указанного AL прерывания из таблицы векторов прерываний. BX содержит смещение, а ES сегмент адреса подпрограммы. В листинге 7.1 показан фрагмент кода, в результате, которого в ВХ будет значение 048B, в ES – 0DDE.
Листинг 7.1. Пример чтения адреса программы прерывания
Mov ah, 35h ; номер функции
Mov al, 21h ; номер прерывания
Int 21h
Функция 25h – выполняет занесение нового вектора прерывания. Вызов:
ah = 25h
al = номер прерывания
Ds:dx – указатель на подпрограмму обработки прерывания
Возвращаемого значения нет. Функция устанавливает адрес прерывания, указанного в al в таблицу векторов прерываний. Регистр dx содержит смещение, а ds – сегмент устанавливаемой подпрограммы.
Прямое обращение к видеопамяти
Видеопамять компьютера любой конфигурации расположена в адресном пространстве оперативного запоминающего устройства (ОЗУ). Это позволяет напрямую адресовать видеопамять одним из косвенных способов адресации памяти. Видеопамять занимает адреса с A000h по BFFFh, что составляет 128 Кбайт. Для увеличения объёмов видеопамяти (до 64 Мбайт), она делиться на слои, так что по одному адресу находиться несколько ячеек, которые расположены в разных слоях. Обращение к видеопамяти зависит от видеорежима, который определяет количество точек по горизонтали и вертикали, а так же количество битов, отводимую для хранения кода цвета каждой точки. Графическими режимами управляет видеоадаптер.
Более простым для программирования, допускающим простой доступ к видеопамяти, является символьный режим, который будет рассмотрен подробнее. Для работы в символьном режиме отводится 16 Кбайт памяти, начиная с адреса B800h. Экран делится на 80 столбцов и 25 строк. Общее количество знакомест составляет 80х25=2000. Для каждого знакоместа в видеопамяти отводится два байта: чётный байт – ASCII код символа, нечётный – байт атрибутов. Счёт строк и колонок идёт из верхнего левого угла экрана, в байте b800h:0000h хранится символ выводящийся в нулевой строке и нулевой колонке, в байте b800h:0001h хранится атрибут этого символа. В байте b800h:0002h хранится символ выводящийся в нулевой строке и первой колонке, в байте b800h:0002h хранится атрибут этого символа и т.д.