GLI INTERRUPT
Un interrupt o interruzione è un evento che interrompe il normale flusso di esecuzione di un programma per eseguire procedure specifiche. Ad esempio una interruzione si può attivare quando:
- Si verificano eventi scaturiti dai dispositivi esterni;
- Condizioni eccezionali (es: divisione per zero);
- Utilizzo di alcune funzionalità del sistema operativo.
Quando un interrupt viene attivato, si trasferisce il controllo del processore dal programma in esecuzione ad una procedura, chiamata routine di servizio dell’interrupt. Terminata l’esecuzione della routine di servizio, il processore riprende l’esecuzione del programma principale.
ATTIVAZIONE DI UN INTERRUPT
Per attivare la routine di servizio (ISR) relativa ad un certo interrupt si usa l’istruzione INT
sintassi: int <numero>
dove <numero> è un valore numerico compreso tra 0 e 255 (00h e FFh).
Cosa avviene quando si attiva un interrupt?
1. Viene interrotta l’esecuzione del programma corrente;
2. Viene salvato nello stack lo stato dei registri IP, CS, SF (flags);
3. L’interrupt inibisce la possibilità di ulteriori interruzioni (azzera il flag IF);
4. Viene prelevato dalla interrupt vector table (IVT) l’indirizzo del gestore di interrupt individuato da <numero>;
5. Salta alla ISR relativa all’interrupt (carica in CS:IP l’indirizzo prelevato);
6. Al termine della procedura, riabilita la possibilità di ulteriori interruzioni;
7. Ripristina i valori di IP, CS, SF dallo stack;
8. Reimposta il flusso del controllo all’istruzione successiva all’interruzione.
Ogni interruzione ha le sue sottofunzioni che devono essere specificate nel registro AH prima di essere attivata.
L’istruzione IRET conclude tutte le ISR, causando il ritorno del sistema nello stato precedente all’ultima interruzione.
INT 10h
SOTTOFUNZIONE (AH) SERVIZIO
00 Modalità video
01 Tipo del cursore
02 Posizione del cursore
03 Lettura posizione del cursore
05 Selezione della pagina video attiva
06/07 Scrolling video
08/09/0A Lettura/scrittura di caratteri a video
0C/0D Lettura/scrittura di pixel
0E Teletype output
13h Scrive una stringa su un terminale
INT 16h
INT 16h / AH = 00h legge un tasto premuto sulla tastiera (senza echo)
Restituisce:
AH = codice BIOS
AL = carattere ASCII
Se un tasto è stato premuto, viene rimosso dal buffer della tastiera
INT 16h / AH = 01h verifica la battitura di un tasto nel buffer della tastiera
Restituisce:
ZF = 1 se non è stato premuto un tasto
ZF = 0 se è stato premuto un tasto
AH = codice BIOS
AL = carattere ASCII
Se un tasto è stato premuto, viene rimosso dal buffer della tastiera
INT 20h
L’ int 20h permette di terminare il programma e restituire il controllo al sistema operativo.
INT 20h è richiamato dall’istruzione RET
INT 21h
SOTTOFUNZIONE SERVIZIO
01/02/05/07 Lettura/scrittura/stampa di caratteri
09/0A Lettura/scrittura di stringhe
0B/0C Gestione tastiera
0E/19 Gestione dei drive
25/35 Programmazione di interrupt
2A/2C Gestione data e ora
39/3A/3B/47 Gestione directory
3C/3D/3E/3F/40/41/42/56 Gestione dei file
4C Ritorno al sistema operativo.
N.B. LE SOTTOFUNZIONI DEGLI INTERRUPT SONO SPECIFICATE NELLA GUIDA IN LINEA DELL’ EMULATORE.
Nel prossimo articolo parleremo di come Scrivere il primo programma, se invece ti sei perso lo scorso articolo, si è parlato delle Istruzioni di trasferimento dei dati.
Stai cercando altre guide? Allora dai uno sguardo alla nostra raccolta dedicata alla Programmazione Assembly.
Alla prossima!
0 Comments