Реальный режим, прерывание замены вектора прерывания - PullRequest
6 голосов
/ 09 мая 2009

Я пытаюсь узнать больше о том, как на самом деле работают системы под всей красивой графикой сверху. Поэтому я сейчас играю с памятью в 512 байт, которую BIOS загружает при запуске, я не могу назвать ее загрузчиком в настоящий момент. В любом случае, я заменяю вектор прерывания, но у меня возникают проблемы с ним. После замены прерывания 09h (клавиатура) он функционирует правильно, при нажатии клавиши выводится «Memory Messing». Но тогда ничего. Каждое нажатие клавиши впоследствии ничего не делает. Я не знаю, происходит ли сбой системы или что-то не хватает в моем обработчике, вот код:

jmp start
times 100 db 0 ; Cleared space for stack

start:
xor ax, ax
mov ax, start
sub ax, 80
mov sp, ax 

mov al, 0x09   ; Interupt number
mov bl, 4
mul bl
mov bx, ax
xor ax, ax
mov es, ax
mov [es:bx], word prints ; My interupt handler
add bx, 2
mov [es:bx], word 0x00

bloader:
    jmp bloader

prints:
    cli
    push ax
    push bx
    push si
    mov si, msg       ; Message to print
    mov bl, 0x07
    mov bh, 0x00
    printnb:
        lodsb     ; Grab byte from message
        cmp al, 0 ; End of message
        je printf
        mov ah, 0x0E
        int 0x10  ; Print byte
        jmp printnb
    printf:
        mov al, 0x20
        out 0x20, al ; Inform interupt controller interupt has been handled
        pop si
        pop bx
        pop ax
        sti
        iret ; Interupt return

msg db "Memory messing",0

times 510 - ($ - $$) db 0
dw 0xAA55

Ответы [ 4 ]

6 голосов
/ 09 мая 2009

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

Что-то вроде:

         in     al, 60h     ; Read input buffer 

может быть все, что нужно.

Если у меня появится возможность, я посмотрю, нет ли у меня старых заметок или кода, когда я писал драйверы клавиатуры.

1 голос
/ 24 февраля 2014

Я нашел другую проблему. Если мы установим новый вектор прерывания для ISR с двумя отдельными командами перемещения, то возможно, что между этими обеими командами mov произойдет прерывание, и тогда он получит адрес из сломанного вектора с одной частью старого местоположения и Другая часть нового местоположения ISR. Но в этом месте нет ISR, нет инструкций для END прерывания, а также нет команды iret.

Для того, чтобы предотвратить такие плохие события, мы должны поместить все эти команды перемещения для установки нового вектора прерывания.

cli
mov [es:bx], word prints ; My interupt handler
mov [es:bx+2], word 0x00
sti

Dirk

1 голос
/ 09 мая 2009

Я предполагаю (я никогда не писал обработчик прерываний клавиатуры), что вам также нужно поговорить с аппаратным обеспечением клавиатуры, чтобы получить нажатие клавиши (в противном случае клавиатура не будет знать, когда сгенерировать следующее прерывание).

0 голосов
/ 09 мая 2009

Это только дикое предположение, но возможно проблема в том, что вы вызываете int 10h из обработчика int 9h. Попробуйте записать в память экрана напрямую (просто увеличьте байт до 0b800h: 0 и отметьте верхний левый символ на экране). Если он увеличивается для каждого нажатия клавиши, вам не следует вызывать int 10h с int 9h.

...