Interrupt managment on 80/86 microprocessor
Table of Contents
- Intel 8086 Microprocessor System Architeture
- Interrupt managment on 80/86 microprocessor
- Programmable Interrupt Controller (PIC Intel 8259a)
- Demo Kernel Multitasking
- The Serial Port
- The Parallel Port
if you are intrested to receive information please write to
Attività di interrupt, la tabella delle interruzioni e riprogrammazione degli interrupt
Interruzione del processo di elaborazione
POSSIBILI ALTERNATIVE:
- Ignorare la richiesta di interruzione e procedere con l'elaborazione
- Aspettare di arrivare ad un punto conveniente e poi soddisfare la richiesta di interruzione
- Interrompere immediatamente l'elaborazione corrente e soddisfare la richiesta
UN SISTEMA A MICROPROCESSORE E' COMPOSTO DA PIU' COMPONENTI HARDWARE. SPESSO QUESTI COMPONENTI HANNO BISOGNO DELLA CPU SOLO IN ALCUNI MOMENTI, IN ALTRI POSSONO FUNZIONARE DA SOLI.
Esempio: visualizazione dinamica dell'ora sul monitor
Ogni secondo la CPU deve mostrare a video l'ora
Alternative:
- In un ciclo infinito la CPU legge l'ora di sistema e la mostra a video => la CPU no puo fare nient'altro
- Ad ogni secondo il clock di sistema interrompe la CPU che quindi mostra l'ora => la CPU e' quasi sempre libera
Interruzioni esterne
Il chip 8086/8088 ha tre ingressi per gestire 3 diversi tipi di interruzioni esterne.
Non Mascherable Interrupt: linea dedicata alle interruzioni che devono essere sempre riconosciute dalla CPU appena è elettricamente possibile, cioè quando l'istruzione corrente è completa (le istruzioni richiedono piu cicli di clock)
INTerrupt Request: linea dedicata alle richieste di interruzione. Questa linea nel PC-IBM è controllata dal 8259 Programmable Interrupt Control (PIC). Può essere disattivata con l'istruzione CLI (STI attiva)
RESET: linea dedicata alla ripartenza del sistema. Tutti i registri interni vengono azzerati tranne CS che viene posto a FFFFh
Attività della CPU durante un Interrupt
- Il registro FLAG viene salvato nello stack (PUSHF)
- Viene disabilitato l'ingresso INTR con l'istruzione CLI
- TF (Trap Flag) viene diabilitato con l'istruzione CLT
- Il registro CS viene salvato nello stack (PUSH CS)
- Il registro IP viene salvato nello stack (PUSH IP)
- Il registro IP viene caricato con l'indirizzo del gestore dell'interrupt.
- Il registro CS viene caricato con il segmento del gestore dell'interrupt.
- Esecuzione dell'interrupt, attraverso la procedura associata (gestore o handler)
- Vengono ripristinati tutti i registri con le diverse istruzioni di POP
- L'indirizzo del gestore dell'interrupt viene prelevato dalla Tabella delle Interruzioni, che contiene gli indirizzi per i gestori di tutti gli interrupt (interni ed esterni) gestiti dalla CPU
La Tabella delle Interruzioni
ELENCO DI 256 INDIRIZZI (SEGMENTO + OFFSET) RELATIVI AI GESTORI DI 256 DIVERSI INTERRUPT
OCCUPA I PRIMI 256x4byte=1024 DELLA MEMORIA DI SISTEMA, CIOE' GLI INDIRIZZI 0000..003FF
Ad esempio, l'indirizzo dell'interrupt 21h è memorizzato all'indirizzo 21Hx4=84H. Precisamente i byte 84H e 85H contengono l'offeset rispetto al segmento che è contenuto nei byte 86H e 87H
Riprogrammazione di un Interrupt
SIGNIFICA SCRIVERE UN GESTORE PER L'INTERRUPT, DA FAR ESEGUIRE AL POSTO DI QUELLO ATTUALE, E SCRIVERE NELLA TABELLA DELLE INTERRUZIONI, L'INDIRIZZO DELLA NUOVA PROCEDURA.
ESEMPIO:riprogrammazione int 1Ch (timer tick).
Si desidera questo interrupt mostra l'ora sul monitor.
- Scriviamo nel segmento CS una procedura di visualizzazione. L'indirizzo fisico di questa procedura è CS:new_1c
- Riprogrammammiamo l'interrupt 1Ch:
- Accesso diretto alla tabella: l'indirizzo del gestore
;per l'int 1Ch si trova 0000:1Chx4=0000:70h lea ax, CS:new_1c ;ax <- offset di new_int1c cli ;INTR off mov 0000:70h,ax ;imposto l'offset mov 0000:72h,CS ;imposto il segmento sti ;INTR on
- Uso di interrupt dos per riprogrammazione
lea dx, CS:new_1c ;dx <- offset di new_int1c mov al,1Ch ;interrupt da riprogrammare mov ah,37h ;servizio riprogrammazione int 21h ;chiamata dos
- Accesso diretto alla tabella: l'indirizzo del gestore
Intercettare un interrupt
SIGNIFICA RIPROGRAMMARE UN INTERRUPT PER ESEGUIRE UNA FUNZIONE UTENTE PRIMA DELL'INTERRUPT ORIGINALE.
IL NUOVO GESTORE DI INTERRUPT TERMINA CON UN SALTO AL VECCHIO GESTORE
NECESSITA' DI MEMORIZZARE L'INDIRIZZO FISICO DEL VECCHIO INTERRUPT, PRIMA DELLA SUAL RIPROGRAMMAZIONE
ESEMPIO:
old_1c DB 0EAh ;codice macchina per jmp old_1c_o DW ? ;offeset dell'interrupt old_1c_s DW ? ;segmento dell'interrupt .... mov ah,53 ;servizio lettura ind. int mov al,1Ch ;interrupt richiesto int 21h ;chiamata dos ;ora es:bx puntano all'interrupt corrente mov old_int1c_o,bx ;salvo l'offset mov old_int1c_s,es ;salvo il segmento ..... ;riprogram. dell'interrupt new_int1c: ..... jmp old_1c ;salto al vecchio int.
Esempi
ESEMPIO: clock.asm
In questo esempio viene intercettato l'INT08H per mostrare a video un contasecondi.
L'INT08H viene generato dal PC ogni 55ms quindi dopo 18 volte e' trascorso circa un secondo e puo' essere aggiornato il monitor.
In ogni caso sempre viene chiamato INT 08h orginale per mantenere integro il sistema
ESEMPIO: keysound.asm
KEYSOUND.ASM incercetta il gestore int09h per la tastiera per emettere un suono ad ogni pressione di un tasto
int09h e viene emesso alla pressione ed al rialscio di un tasto il suono invece viene generato solo alla pressione. In ogni caso viene sempre chiamato il INT09H orginale per garantire il funzionamento della tastiera
ESEMPIO: scr2txt.asm
Riprogrammazione dell'INT 05h collegato al tasto print screen per salvare il contenuto dello schermo 25x80 caratteri in un file di testo.
In questo esempio viene riprogrammato l'interrupt e si perde la funzione originale.
This work is property of Pk Lab. You can use it for free but you must retain author's copyright.