Interrupt (il cod. op. INT sta per INTERRUPT) Tutto il sistema del computer va visto come composto da sottosistemi hardware (la tastiera, il monitor, la stampante, l’hard disk, etc.) e da sottosistemi software, programmi che stanno funzionando, di cui il più importante è il Sistema Operativo. La tecnica più impiegata in un computer per far comunicare fra di loro questi sottosistemi è quella degli interrupt: ad esempio quando noi pigiamo un tasto la tastiera, oltre ad inviare il codice del tasto, invia anche un interrupt al sistema che significa, per l’appunto, “tasto premuto”. In linea teorica un programma per non combinare dei guai deve poter interagire SOLO con il Sistema Operativo. Se, ad esempio, un programma deve visualizzare una scritta sul video oppure leggere un dato dalla tastiera (operazioni che vedremo più avanti) deve chiederlo al Sistema Operativo e per farlo deve impiegare degli interrupt. Per chiedere un servizio a un sistema operativo non è sufficiente il numero dell’interrupt ma bisogna proprio specificare il sevizio (solitamente attraverso il registro AX), questo perché i servizi sono moltissimi ed evolvono con i sistemi operativi. In pratica bisogna vedere il sistema operativo come un programma supervisore che ci mette a disposizione dei procedimenti per comunicare con le altri parti del computer. Per accedere a questi procedimenti dobbiamo vedere in un manuale di programmazione (o in un manuale di interrupts) prima quale è l’interrupt che fornisce il servizio e poi, visto che un interrupt con un certo numero può fornire più servizi, il numero del servizio stesso. 1 MOV INT AX, 4C00h 21 Nel nostro programma l’impiego dell’INT 21, servizio 4Ch, dice al sistema operativo che il programma è terminato. Quando il sistema operativo riceve questa richiesta sa che può riprendere il controllo della CPU per svolgere i propri compiti. Il registro CS viene settato con un nuovo Code Segment (quello del programma viene cancellato) e IP punta alla prossima istruzione (del programma sistema operativo) da eseguire. Questa è la sintassi completa di questo servizio riportata nel manuale di programmazione del DOS: -----------------------------------------------------INT 21 - DOS 2+ - QUIT WITH EXIT CODE (EXIT) AH = 4Ch AL = exit code to operative system Return: never returns ------------------------------------------------------ 2 Interrupt software Vediamo qualche esempio di interrupt generabili da un nostro programma -----------------------------------------------------INT 21 - DOS 2+ - GET CURRENT DIRECTORY AH = 47h DL = drive (0=default, 1=A, etc.) DS:SI points to 64-byte buffer area Return: CF = 1 if error AX = Error Code Note: the returned path does not include the initial backslash -----------------------------------------------------INT 21 - DOS 2+ - RENAME A FILE AH = 56h DS:DX -> ASCIZ old name ES:DI -> ASCIZ new name Return: CF = 1 if error AX = Error Code Note: allows move between directories on same logical volume (DOS 3.x) allows renaming of directories -----------------------------------------------------INT 33 - DOS 3+ - MS MOUSE RETURN POSITION AND BUTTON STATUS AX = 0003h Return: BX = button status bit 0 left button pressed if 1 bit 1 right button pressed if 1 bit 2 middle button pressed if 1 (Mouse Systems mouse) CX = column DX = row ------------------------------------------------------ 3 Interrupt interni e Interrupt hardware E adesso qualche altro tipo di interrupt non generabili, però, dai nostri programmi: -----------------------------------------------------INT 04 - internal - OVERFLOW Generated by INTO instruction if OF flag is set. If flag is not set, INTO is effectively a NOP. Used to trap any arithmetic errors before the erroneous results propagate further through the computation. -----------------------------------------------------INT 06 - internal - UNDEFINED OPCODE (80286) -----------------------------------------------------INT 00 - internal - DIVIDE ERROR Automatically called at end of DIV or IDIV operation that results in error or overflow. -----------------------------------------------------INT 09 - hardware - IRQ1 - KEYBOARD INTERRUPT Generated when data is received from the keyboard. -----------------------------------------------------INT 0E - hardware - IRQ6 - DISKETTE INTERRUPT Generated by floppy disk controller on completion of an operation -----------------------------------------------------INT 0C - hardware - IRQ4 - COM1 INTERRUPT -----------------------------------------------------INT 02 - hardware - NMI (NON-MASKABLE INTERRUPT) Generated by NMI signal in hardware. This signal has various uses:Parity error, Disk-controller power, System suspended, … ----------------------------------------------------- 4 Classificazioni degli Interrupt SOFTWARE INTERNAL Generati da un programma (anche un nostro programma) e sono impiegati per chiedere un servizio al sistema operativo Generati dalla CPU e, di massima, sono anche questi impiegati per richiedere un servizio al sistema operativo (ad es. per visualizzare un msg di errore) HARDWARE Generati da una periferica / dispositivo hardware verso la CPU MASKABLE Mascherabili (e quindi, ignorabili) dalla CPU (esiste un cod. op. che dice alla CPU di ignorare gli interrupt) INTERRUPT NON MASKABLE Non mascherabili 5 Classificazioni degli Interrupt Quindi gli interrupt possono essere: SOFTWARE, INTERNAL o HARDWARE. Quelli Software sono generati dai programmi. In caso di errori del programma è la CPU a generare direttamente un interrupt, in questo caso definiti internal, e servono per dire al sistema operativo che bisogna visualizzare un messaggio di errore all’utente (anche la CPU comunica con il sistema operativo tramite interrupt) Quelli Hardware non sono divisi per servizio (quando si parla di servizio si intende di servizi da richiedere al sistema operativo), come quelli software, ma per IRQ (che sta per interrupt request e che significa che un dispositivo ha fatto una richiesta di interrupt, di interruzione, alla CPU) e sono generati dalle periferiche (tastiera, stampante, floppy, hard disk, porta seriale, etc...) verso la CPU. La CPU quando riceve un interrupt interrompe (da cui il nome) le operazioni che stava svolgendo per verificare cosa è accaduto ed, eventualmente, eseguire una parte di programma associata all’interrupt ricevuto. In certi casi, quando la CPU sta svolgendo un compito delicato, maschera gli interrupt, nel senso che li ignora. Alcuni interrupt sono, però, molto importanti e non possono essere ignorati, ad esempio quando l’utente preme il pulsante di sospensione, oppure quando viene a mancare la corrente ... Questi interrupt sono definiti NMI, ovvero INTERRUPT NON MASCHERABILI 6