PkLab.net
Meccatronica
Italy - Basilicata - Matera
 
Robotica&Image processing Sistemi di controllo Applicazioni speciali Networking Didattica
 
Home e contatti
INTERRUZIONI INTEL 8086

INTERRUZIONI

Nota: questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte

INTERRUZIONE DEL PROCESSO DI ELABORAZIONE

POSSIBILI ALTERNATIVE:
 

  1. Ignorare la richiesta di interruzione e procedere con l'elaborazione
  2. Aspettare di arrivare ad un punto conveniente e poi soddisfare la richiesta di interruzione
  3. 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:

  1. In un ciclo infinito la CPU legge l'ora di sistema e la mostra a video => la CPU no puo fare nient'altro
  2. 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

ATTIVITA' DELLA CPU DURANTE UN INTERRUPT

  1. Il registro FLAG viene salvato nello stack (PUSHF)
  2. Viene disabilitato l'ingresso INTR con l'istruzione CLI
  3. TF (Trap Flag) viene diabilitato con l'istruzione CLT
  4. Il registro CS viene salvato nello stack (PUSH CS)
  5. Il registro IP viene salvato nello stack (PUSH IP)
  6. Il registro IP viene caricato con l'indirizzo del gestore dell'interrupt.
  7. Il registro CS viene caricato con il segmento del gestore dell'interrupt.
  8. Esecuzione dell'interrupt, attraverso la procedura associata (gestore o handler)
  9. Vengono ripristinati tutti i registri con le diverse istruzioni di POP
  10. 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 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.
 

  1. Scriviamo nel segmento CS una procedura di visualizzazione. L'indirizzo fisico di questa procedura è CS:new_1c
  2. Riprogrammammiamo l'interrupt 1Ch:
    1. 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 
    2. 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
      

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.


Il PKLAB aderisce ai principi Open Access della Dichiarazione di Berlino (Sito italiano)
[Home Page]  [System Control]   [Robotic & Image processing]   [Applicazioni Speciali]  [Didattica]   [Networking]   [Search]

Contatto:
Valid CSS!