2009-05-09 7 views
6

Sto cercando di saperne di più su come i sistemi funzionano davvero al di sotto di tutte le belle grafiche in alto. Quindi attualmente sto giocando con la memoria nei 512bytes che il BIOS carica all'avvio, non posso davvero chiamarlo bootloader al momento immagino. Ad ogni modo, sto sostituendo un vettore di interrupt ma ho problemi con esso. Dopo aver sostituito l'interrupt 09h (la tastiera) funziona correttamente, sul tasto viene visualizzato "Memory messing". Ma poi niente. In seguito, ogni tasto non fa nulla. Non so se il sistema si blocca o se mi manca qualcosa dal mio gestore, ecco il codice:Modalità reale, sostituzione del vettore di interruzione Blocco

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 

risposta

6

È passato molto tempo da quando ho lavorato sull'interruzione della tastiera, ma penso che manchi l'hardware della tastiera in modo da eliminare la condizione di interruzione e essere pronto a generare un altro interrupt.

Qualcosa di simile:

  in  al, 60h  ; Read input buffer 

potrebbe essere tutto quello che serve.

Se ho la possibilità, vedrò se ho qualche vecchio documento o codice in giro da quando ho scritto i driver della tastiera.

+0

Questo problema è stato risolto. Grazie a tutti. – Dave

0

Questo è solo un ipotesi, ma forse il problema è che si sta chiamando int 10h dal gestore int 9h. Prova a scrivere direttamente sullo schermo (basta incrementare il byte a 0b800h: 0 e controllare il carattere in alto a sinistra sullo schermo). Se viene incrementato per ogni pressione di un tasto, non si dovrebbe chiamare int 10h da int 9h.

1

La mia ipotesi (non ho mai scritto un gestore di interrupt di tastiera) è che è necessario parlare anche con l'hardware della tastiera, per recuperare la sequenza di tasti (altrimenti la tastiera non saprà quando generare un successivo interrupt).

1

Ho trovato un altro problema. Se impostiamo un nuovo vettore di interrupt per un ISR con due istruzioni di spostamento separate, allora è possibile che tra queste due istruzioni di movimento si verifichi un interrupt e quindi ottenga l'indirizzo da un vettore danneggiato con una parte della vecchia posizione e il altra parte della nuova posizione dell'ISR. Ma in questa posizione non c'è ISR, nessuna istruzione per una FINE di interruzione e anche nessuna istruzione IRET.

Per evitare eventi di questo tipo, è necessario posizionare un cli e uno sti attorno alle istruzioni di spostamento per impostare un nuovo vettore di interrupt.

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

Dirk

Problemi correlati