Цитата:
А гадать без кода предлагаете?
Показывайте код обработчика прерывания.
Код:
; Exception handler - Обработчики исключений
exc_0: ; Нарушение. Ошибка деления, код ошибки-нет. Вызвано: div, idiv
prints "exc - 0, Fault. #DE - Divide Error Exception. Induced (div, idiv).", 1
prints "Induced (div, idiv).", 1
iret
exc_1: ; Нарушение/Ловушка. Исключение отладки. Код ошибки-нет.
prints "exc - 1, Fault/Trap. #DB - Debug Exception.", 1
iret
exc_2: ; Немаскируемые прерывания поступающие на порт NMI. (Аппаратный сбой)
prints "exc - 2, Interrupt. Hardware failure.", 1
prints "Induced (Hardware failure).", 1
jmp $
exc_3: ; Ловушка. Программное прерывание служащее для отладки. Вызвано: int 3
prints "exc - 3, Trap. #BP - Breakpoint Exception.", 1
prints "Induced (int 3).", 1
iret
exc_4: ; Ловушка. Фиксирует арефметическое переполнение(overflow). Код ошибки-нет. Вызвано: into
prints "exc - 4, Trap. #OF - Overflow Exception.", 1
prints "Induced (into).", 1
iret
exc_5: ; Нарушение. Нарушение границ массива. Код ошибки-нет. Вызвано: bound
prints "exc - 5, Fault. #BR - BOUND Range Exceeded Exception.", 1
prints "Induced (bound).", 1
jmp $
exc_6: ; Нарушение. Недопустимый код команды. Код ошибки-нет.
prints "exc - 6, Fault. #UD - Invalid Opcode Exception.", 1
prints "Induced (invalid command).", 1
jmp $
exc_7: ; Нарушение. Сопроцессор не доступен. Код ошибки-нет. Вызвано: esc, wait
prints "exc - 7, Fault. #NM - Device Not Available Exception.", 1
prints "Induced (esc, wait).", 1
jmp $
exc_8: ; Авария. Двойное нарушение. Код ошибки-да
prints "exc - 8, Abort. #DF - Double Fault Exception.", 1
iret
exc_9: ; Авария. Выход сопроцессора из сегмента. Код ошибки-нет
prints "exc - 9, Fault. The output of the coprocessor segment.", 1
jmp $
exc_10: ; Нарушение. Недопустимый сегмент состояния задачи TSS. Код ошибки-да. Вызвано: jmp, call, iret, прерывание
;pop eax ; код ошибки
prints "exc - 10, Fault. #TS - Invalid TSS Exception.", 1
prints "Induced (jmp, call, iret, interrupt).", 1
jmp $
exc_11: ; Нарушение. Отсутствие сегмента. Код ошибки-да. Вызвано: команда загрузки сегментного регистра
;pop eax ; код ошибки
prints "exc - 11, Fault. #NP - Segment Not Present.", 1
prints "Induced (segment register load command).", 1
jmp $
exc_12: ; Нарушение. Ошибка обращения к стеку. Код ошибки-да. Вызвано: командой обращения к стеку
;pop eax ; код ошибки
prints "exc - 12, Fault. #SS - Stack Fault Exception. Induced (stack access command).", 1
prints "Induced (stack access command).", 1
jmp $
exc_13: ; Нарушение. Общая защита. Код ошибки-да. Вызвано: команда обращения к памяти
;pop eax ; код ошибки
prints "exc - 13, Fault. #GP - General Protection Exception.", 1
prints "Induced (memory access command).", 1
jmp $
exc_14: ; Нарушение. Страничное нарушение. Код ошибки-да. Вызвано: команда обращения к памяти
;pop eax ; код ошибки
prints "exc - 14, Fault. #PF - Page-Fault Exception.", 1
prints "Induced (memory access command).", 1
jmp $
;exc_15 ; Не используется
exc_16: ; Нарушение. Сопроцессор не доступен. Код ошибки-нет. Вызвано: esc, wait
prints "exc - 16, Fault. #MF - x87 FPU Floating-Point Error.", 1
prints "Induced (esc, wait).", 1
jmp $
exc_17: ; Нарушение. Ошибка выравнивания. Код ошибки-да. Вызвано: команда обращения к памяти
;pop eax ; код ошибки
prints "exc - 17, Fault. #AC - Alignment Check Exception.Induced (memory access command).", 1
prints "Induced (memory access command).", 1
jmp $
Код:
; Hardware interrupt handlers - Обработчики аппаратных прерываний
; Пустой обработчик. сбрасывает заявку в контроллере (End Of Interrupt)
int_EOI:
ci_8259A.eoi ; Конец прерывания
iretd ; возврат из прерывания
; IRQ 0 обработчик - системный таймер
int8_handler:
jmp int_EOI ; сбросим заявку на прерывание
; IRQ 1 обработчик - клавиатура
int9_handler:
keybord.read_scode_from_port_to_buff ; Вызвать драйвер клавиатуры
jmp int_EOI ; сбросим заявку на прерывание
Код:
; Обработчики системных вызовов
; Системный вызов INT 48 - печать строки
; входные параметры: DS:ESI указывает на ASCIIZ-строку
syscall_handler:
iretd
Цитата:
Кольцо R3 используете или только R0?
Пока только R0
Вот еще инициализация PIC
Код:
PORT_20 = 20h ; Master PIC — Command
PORT_21 = 21h ; Master PIC — Data
PORT_A0 = 0A0h ; Slave PIC — Command
PORT_A1 = 0A1h ; Slave PIC — Data
OCW2_EOI = 20h ; команда (End Of Interrupt). сбрасывает бит в регистре ISR
macro outp port,data
{
push eax
mov al,data
out port,al
pop eax
}
; Перепрограммируем контроллеры прерываний
macro ci_8259A.init
{
push ebx edx
mov bl,32
mov bh,32+8
mov dx,0
call redirect_IRQ
pop edx ebx
}
; Очистка регистров обслуживания прерывания ISR. Сбрасывает заявку в обоих контроллерах
macro ci_8259A.eoi
{
; Сброс заявки в контроллере прерываний: посылка End-Of-Interrupt (EOI)
outp PORT_20,OCW2_EOI ; ... в ведущий (Master) контроллер ...
outp PORT_A0,OCW2_EOI ; ... и в ведомый (Slave) контроллер.
}
; Вход:
; BL - Начало для IRQ 0..7
; BH - начало для IRQ 8..15
; DL - Маска для IRQ 0..7,
; DH - Маска для IRQ 8..15
redirect_IRQ:
; Перепрограммирование ведущего (Master) контроллера
outp PORT_20,11h ; ICW1 - два контроллера
outp PORT_21,bl ; ICW2 - базовые номера векторов
outp PORT_21,04h ; ICW3 - ведомый контроллер подсоеденен к входу 2
outp PORT_21,ICW4_EOI ; ICW4 - требуется программная генерация EOI
outp PORT_21,dl ; OCW1 - Маска прерываний для IRQ 0..7
; Перепрограммирование ведомого (Slave) контроллера
outp PORT_A0,11h ; ICW1 - два контроллера
outp PORT_A1,bh ; ICW2 - базовые номера векторов
outp PORT_A1,02h ; ICW3 - ведущий контроллер подключен к выходу 3
outp PORT_A1,ICW4_EOI ; ICW4 - требуется программная генерация EOI
outp PORT_A1,dh ; OCW1 - Маска прерываний для IRQ 8..15
ret