![]() Все для программиста |
Перхватываем прерывание 08h |
Перопределения прерывания в MS DOS
Перехватить прерывание не есть проблема, основная проблема состоит в написании нового обработчика.
В MS DOS переопределение стандартного прерывания производится следующим образом:
Получаем адрес старого обработчика.
Таблица векторов прерывания находися с адреса 0000:0000 и имеет 256 элементов (по количеству прерываний). Каждый элемент таблицы - 4-ех байтный вектор - адресс процедуры обработчика.
Для получения адреса старого прерывания можно воспользоватся функцией 35h MS DOS: Дать вектор прерывания.
Описание: Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES - 0000:[(AL*4)+2].
; Сохраняем 08h mov ah,035h mov al,008h int 021h mov [cs:oldseg08],es mov [cs:oldofs08],bx
При отсутствии MS-DOS (мы в конце концов ОС пишем) можно на прямую прочитать значения таблицы векторов прерываний:
; Сохраняем 08h push ds xor bx,bx mov ds,bx mov bx,[ds:0020h] mov es,[ds:0022h] mov [cs:oldseg08],es mov [cs:oldofs08],bx pop ds
Установаем новый обработчик.
Для установки адреса нового прерывания можно воспользоватся функцией 25h MS DOS: Установить вектор прерывания
Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX.
Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы.
; Вешаемся на 08h push ds mov ax,cs mov ds,ax lea dx,[kernel] // Адрес нового обработчика mov ah,025h mov al,008h int 021h pop ds
При отсутствии MS-DOS можно на прямую изменить значения таблицы векторов прерываний:
; Вешаемся на 08h call _di // Блокируем прерывания push ds xor bx,bx mov ds,bx lea bx,[cs:kernel] // Адрес нового обработчика mov [ds:0020h],bx mov [ds:0022h],cs pop ds call _ei // Разрешаем прерывания
Код отвечающий за установку новых прерываний находится в модуле mtasks.asm - процедуры getvectors, setvectors и restorevectors.
<< Начало