Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab7-2012.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
224.26 Кб
Скачать
    1. Формування таблиці векторів переривань (idt)

В загальному випадку таблиця містить системні дескриптори (шлюзи) пасток, переривань та задач. В даній роботі вона містить лише шлюзи пасток. Шлюз пастки, як і інші дескриптори, має розмір 8 байт і містить наступні поля, в порядку їх розміщення в дескрипторі:

  1. Молодші 2 байти зміщення процедури обробки переривань в відповідному сегменті кодів (в нашому випадку - в сегменті Int_code)

  2. 2 байти селектора сегмента (в нашому випадку offset deskr_Int_code)

  3. Нульовий байт

  4. Байт атрибутів (в нашому випадку це 10001111b)

  5. Старші два байти зміщення процедури обробки переривань в відповідному сегменті кодів (в нашому випадку нульове значення, оскільки сегмент Int_code має розмір менше чим 64К)

Таким чином в нашому випадку всі шлюзи будуть відрізняться лише вмістом першого поля.

Таблицю IDT доцільно розміщувати в окремому сегменті:

IDT segment para public 'data' use16

Vector=0

Rept 256

Dw Vector * Proc_int_size; зміщення процедури

Dw offset deskr_Int_code; селектор дескриптора в GDT

Db 0; завжди 0

Db 10001111b ;байт атрибутів - шлюз пастки

Dw 0; всі процедури розміщуються в перших 64К

Vector=Vector+1

Endm

IDT ends

    1. Формування та запис вказівника таблиці векторів переривань.

До програмно доступних регістрів процесора відноситься спеціальний регістр IDTR, який повинен містить фізичну адресу таблиці векторів переривань та її розмір. Завантаження цього регістру може виконуватись в реальному режимі за допомогою команди LIDT процесора, яка повинна адресувати 6-байтний вказівник

Визначимо вказівник для IDT (в логічному сегменті даних _DATA):

pidt pointdt <>

Формування вказівника і завантаження IDT (вважаємо, що регістр DS містить адресу сегменту _DATA, а Асемблер за допомогою директиви assume про це проінформований):

; формування IDT

xor eax,eax

mov ax,IDT

shl eax,4

mov pidt.adr,eax

mov pidt.lim,8*256

; завантаження IDT

lidt pidt

В результаті сформовано всі необхідні системні дані для запуску процедур обробки переривань по любому із 256 векторів. Обробка переривання полягає в виведенні на екран номера вектора та передачу управління на переключення в реальний режим.

    1. Відновлення стандартної таблиці переривань при переключенні в реальний режим

Після повернення в режим реальних адрес перед тим, як дозволить переривання, необхідно в IDTR завантажити покажчик таблиці переривань реального режиму, наприклад

xor eax,eax

mov pidt.adr,eax

mov pidt.lim,3ffh

lidt pidt

РЕКОМЕНДАЦІЯ ПО НАЛАГОДЖЕННЮ ПРОГРАМ.

Після переключення в захищений режим не має можливості використати ні AFD ні TD. Крім того, в результаті помилок в формуванні системних даних захищеного режиму процесор напевно буде автоматично перезапускатись. Для визначення команди (групи команд), які призводять до аварії можна використовувати команду

Jmp $ ; передача управління на саму себе

В результаті програма “зациклиться” і аварії не буде. Якщо програма приводить до аварії, то “аварійні” команди виконуються раніше, ніж команда Jmp $ . Послідовно розміщуючи команду Jmp $ можна визначить команду, яка призводить до аварії та визначить помилку в програмі.

Інколи допомагає виведення на екран довільних повідомлень , або вмісту регістрів (наприклад за допомогою процедури SHOW із лабораторної роботи №6.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]