Все для программиста

Перхватываем прерывание 08h


Перопределения прерывания в MS DOS

Перехватить прерывание не есть проблема, основная проблема состоит в написании нового обработчика.

В MS DOS переопределение стандартного прерывания производится следующим образом:

  1. Получить адрес старого обработчика.
  2. Установить новый обработчик.
  3. Выполнить программу.
  4. восстановить старый обработчик.

Получаем адрес старого обработчика.

Таблица векторов прерывания находися с адреса 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.

<< Начало