Assembly Avanzato
INT | Eccezione |
---|---|
00h | Si è verificata una divisione per zero durante una operazione |
01h | Esecuzione single-step di un programma (debug mode) |
03h | Breakpoint incontrato in un programma |
04h | Si è verificato un overflow durante una operazione |
05h | Bound range exceeded (indice fuori limite in un vettore) |
06h | Opcode non valido |
07h | Dispositivo (o estensione della CPU) non disponibile |
0Dh | General protection fault (protected mode) |
0Eh | Page fault (protected mode) |
Nota importante. Prima di chiamare una ISR, è necessario salvare lo stato del programma da interrompere; a tale proposito, la CPU si limita a salvare solamente il contenuto del registro FLAGS. Il compito importantissimo di salvare il contenuto di eventuali registri, spetta quindi alla ISR; in sostanza, la ISR deve preservare il contenuto di tutti i registri che utilizza. Se non si rispetta questa regola, al termine della ISR viene riavviato il programma precedentemente interrotto, il quale si trova a lavorare con dei registri il cui contenuto ha subito modifiche; la conseguenza è che, in genere, il programma va in crash! |
Nota importante. Teoricamente, il programmatore ha la possibilità di intercettare una qualsiasi interruzione n, hardware o software; a tale proposito, non deve fare altro che installare in memoria una propria ISR il cui indirizzo deve essere collocato all'indice n nella IVT. In realtà, è vivamente sconsigliabile intercettare tutte quelle interruzioni (soprattutto hardware) associate a ISR che svolgono compiti molto complessi e delicati; ciò è vero, in particolare, per la INT 02h che viene associata ad una NMI! |
Nota importante. Al termine di una ISR destinata a soddisfare una richiesta di I/O da parte di una periferica, non è sufficiente eseguire una istruzione IRET (come accade per le interruzioni software o per le eccezioni); il programmatore deve prima provvedere ad inviare al PIC un apposito segnale denominato EOI (End Of Interrupt). Il compito di tale segnale è quello di riportare a 0 il bit del registro ISR corrispondente alla IRQ appena elaborata; se non viene compiuto questo passo, il PIC non sarà più in grado di elaborare ulteriori IRQ associate a quello stesso bit rimasto a 1 nel registro ISR! |
Porta | Indirizzo |
---|---|
MPICP0 | 20h |
MPICP1 | 21h |
SPICP0 | A0h |
SPICP1 | A1h |
Bit | Significato |
---|---|
0 | ICW4 richiesto? 0 = no, 1 = si |
1 | PIC in cascata? 0 = si, 1 = no |
2 | Dimensione indirizzi IVT: 0 = 4 byte, 1 = 8 byte |
3 | Rilevamento IRQ: 0 = edge-triggered, 1 = level-triggered |
4 | Tipo comando: 1 = ICW1 |
5 | Indirizzi ISR per le CPU MCS-80/85 (000b per le CPU 80x86) |
6 | |
7 |
Bit | Significato |
---|---|
0 | Non usati (ignorati) |
1 | |
2 | |
3 | Interrupt Type - bit 3 |
4 | Interrupt Type - bit 4 |
5 | Interrupt Type - bit 5 |
6 | Interrupt Type - bit 6 |
7 | Interrupt Type - bit 7 |
Bit | Significato |
---|---|
0 | 0 = IRQ0, 1 = INT da un PIC Slave (CAS = 000b) |
1 | 0 = IRQ1, 1 = INT da un PIC Slave (CAS = 001b) |
2 | 0 = IRQ2, 1 = INT da un PIC Slave (CAS = 010b) |
3 | 0 = IRQ3, 1 = INT da un PIC Slave (CAS = 011b) |
4 | 0 = IRQ4, 1 = INT da un PIC Slave (CAS = 100b) |
5 | 0 = IRQ5, 1 = INT da un PIC Slave (CAS = 101b) |
6 | 0 = IRQ6, 1 = INT da un PIC Slave (CAS = 110b) |
7 | 0 = IRQ7, 1 = INT da un PIC Slave (CAS = 111b) |
Bit | Significato |
---|---|
0 | CAS (cascade) |
1 | |
2 | |
3 | Riservati (devono valere 00000b) |
4 | |
5 | |
6 | |
7 |
Bit | Significato |
---|---|
0 | Modalità: 0 = MCS-80/85, 1 = 80x86 |
1 | EOI: 0 = normal mode, 1 = auto mode |
2 | Bufferizzazione dati: 00b e 01b = no, 10b = si (Slave), 11b = si (Master) |
3 | |
4 | Gestione IRQ: 0 = sequential mode, 1 = SFNM |
5 | Riservati (devono valere 000b) |
6 | |
7 |
%assign MPICP0 20h ; porta P0 del PIC Master %assign MPICP1 21h ; porta P1 del PIC Master %assign SPICP0 0A0h ; porta P0 del PIC Slave %assign SPICP1 0A1h ; porta P1 del PIC Slave %assign MPIC_BASE_TYPE 08h ; BASE_TYPE del PIC Master %assign SPIC_BASE_TYPE 70h ; BASE_TYPE del PIC Slave cli ; clear INT enable flag ; inizializzazione PIC Slave mov al, 00010001b ; ICW1 = ICW4 richiesto, CAS out SPICP0, al ; scrive ICW1 mov al, SPIC_BASE_TYPE ; ICW2 = 70h out SPICP1, al ; scrive ICW2 mov al, 00000010b ; ICW3 = Slave connesso a IR2 Master out SPICP1, al ; scrive ICW3 mov al, 00000001b ; ICW4 = normal EOI, sequential out SPICP1, al ; scrive ICW4 ; inizializzazione PIC Master mov al, 00010001b ; ICW1 = ICW4 richiesto, CAS out MPICP0, al ; scrive ICW1 mov al, MPIC_BASE_TYPE ; ICW2 = 08h out MPICP1, al ; scrive ICW2 mov al, 00000100b ; ICW3 = input IR2 da Slave out MPICP1, al ; scrive ICW3 mov al, 00000001b ; ICW4 = normal EOI, sequential out MPICP1, al ; scrive ICW4 sti ; set INT enable flag |
IRQ | Assegnato a | INT |
---|---|---|
0 | PIT 8254 - Programmable Interval Timer | 08h |
1 | Keyboard controller | 09h |
2 | IRQ da 8 a 15 in cascata dal PIC Slave | 0Ah |
3 | Serial port COM2 (o COM4) | 0Bh |
4 | Serial port COM1 (o COM3) | 0Ch |
5 | Parallel port LPT2 | 0Dh |
6 | Floppy Disk controller | 0Eh |
7 | Parallel port LPT1 | 0Fh |
IRQ | Assegnato a | INT |
---|---|---|
8 | CMOS-RTC - Real Time Clock | 70h |
9 | VGA/LAN/ACPI (IRQ2 Dirottata dal PIC Master) | 71h |
10 | Riservato (schede video) | 72h |
11 | Riservato (schede audio) | 73h |
12 | Mouse PS/2 | 74h |
13 | Eccezioni del coprocessore matematico (FPU) | 75h |
14 | Hard Disk controller (IDE0) | 76h |
15 | Riservato (IDE1) | 77h |
cat /proc/interrupts
Bit | Significato |
---|---|
0 | IMR - IR0: 0 = unmask, 1 = mask |
1 | IMR - IR1: 0 = unmask, 1 = mask |
2 | IMR - IR2: 0 = unmask, 1 = mask |
3 | IMR - IR3: 0 = unmask, 1 = mask |
4 | IMR - IR4: 0 = unmask, 1 = mask |
5 | IMR - IR5: 0 = unmask, 1 = mask |
6 | IMR - IR6: 0 = unmask, 1 = mask |
7 | IMR - IR7: 0 = unmask, 1 = mask |
in al, MPICP1 ; legge l'IMR del PIC Master or al, 00000010b ; pone a 1 il bit 1 di AL out MPICP1, al ; scrive OCW1 nell'IMR |
in al, MPICP1 ; legge l'IMR del PIC Master and al, 11111101b ; pone a 0 il bit 1 di AL out MPICP1, al ; scrive OCW1 nell'IMR |
Bit | Significato |
---|---|
0 | Livello di rotazione priorità IRQ |
1 | |
2 | |
3 | Il valore 00b identifica OCW2 |
4 | |
5 | End Of Interrupt |
6 | Livello di rotazione: 0 = ruota di 1, 1 = vedi bit 0, 1, 2 |
7 | Rotazione priorità: 0 = no, 1 = vedi bit 6 |
Ingresso | IR0 | IR1 | IR2 | IR3 | IR4 | IR5 | IR6 | IR7 |
---|---|---|---|---|---|---|---|---|
Priorità | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 |
Ingresso | IR0 | IR1 | IR2 | IR3 | IR4 | IR5 | IR6 | IR7 |
---|---|---|---|---|---|---|---|---|
Priorità | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 |
mov al, 20h ; OCW2 = Specific EOI out MPICP0, al ; scrive OCW2 nel PIC Master |
mov al, 20h ; OCW2 = Specific EOI out SPICP0, al ; scrive OCW2 nel PIC Slave out MPICP0, al ; scrive OCW2 nel PIC Master |
Bit | Significato |
---|---|
0 | Lettura registri IRR (10b) e ISR (11b) |
1 | |
2 | Polling mode: 0 = no, 1 = si |
3 | Il valore 01b identifica OCW3 |
4 | |
5 | Mask mode: 0 = normal, 1 = special |
6 | Special mask mode: 0 = no, 1 = si |
7 | Riservato (deve valere 0) |
Contenuto | IN | -- | -- | -- | -- | W2 | W1 | W0 |
---|---|---|---|---|---|---|---|---|
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
in al, MPICP1 ; legge l'IMR del PIC Master or al, 00000010b ; pone a 1 il bit 1 di AL out MPICP1, al ; scrive OCW1 nell'IMR |
in al, MPICP1 ; legge l'IMR del PIC Master and al, 11111101b ; pone a 0 il bit 1 di AL out MPICP1, al ; scrive OCW1 nell'IMR |
Bit | Significato |
---|---|
0 | Stato del tasto [Shift Right] |
1 | Stato del tasto [Shift Left] |
2 | Stato del tasto [Ctrl] (Left o Right) |
3 | Stato del tasto [Alt] (Left o Right) |
4 | Stato del led "Scroll Lock" |
5 | Stato del led "Numeric Lock" |
6 | Stato del led "Caps Lock" |
7 | Stato del tasto [Ins] |
Bit | Significato |
---|---|
0 | Stato del buffer di Output: 0 = vuoto, 1 = pieno |
1 | Stato del buffer di Input: 0 = vuoto, 1 = pieno |
2 | Flag di sistema (POST): 0 = fallito, 1 = passato |
3 | Informazioni in attesa: 0 = dato (60h), 1 = comando (64h) |
4 | Stato della tastiera: 0 = disabilitata, 1 = abilitata |
5 | Errore in fase di trasmissione: 0 = no, 1 = si |
6 | Errore di time-out: 0 = no, 1 = si |
7 | Errore di parità: 0 = no, 1 = si |
xor cx, cx ; max 65536 iterazioni wait_for_input: in al, 64h ; legge lo Status Byte (OBC) test al, 00000010b ; bit 1 = 0? loopnz wait_for_input ; controllo loop in al, 60h ; lettura dati (KBC) |
CX = 0 - 1 = FFFFh = 65535
Bit | Significato |
---|---|
0 | Scroll Lock LED: 0 = off, 1 = on |
1 | Numeric Lock LED: 0 = off, 1 = on |
2 | Caps Lock LED: 0 = off, 1 = on |
3 | Riservati (devono valere 00000b) |
4 | |
5 | |
6 | |
7 |
; AL = informazione da scrivere sendData: cli ; disabilita le INT masch. push ax ; salva AX xor cx, cx ; max 65536 iterazioni wait_for_output: in al, 64h ; legge lo Status Byte (OBC) test al, 00000001b ; bit 0 = 0? loopnz wait_for_output ; controllo loop pop ax ; ripristina AX out 60h, al ; invio dati al KBC sti ; ripristina le INT masch. retn ; NEAR return |
mov al, 0EDh ; mode indicators call sendData ; scrive il comando mov al, 00000111b ; tutti i LED accesi call sendData ; scrive il comando |
Nota importante. Bisogna ribadire che la gestione dei comandi di configurazione della tastiera è di competenza del BIOS e del SO; è vivamente sconsigliabile quindi affidare questo compito ai propri programmi in quanto si possono provocare malfunzionamenti del computer. Si tenga anche presente che sui vecchi PC di classe XT, l'invio di comandi casuali alla tastiera poteva provocare anche danni all'hardware; per maggiori dettagli, si consiglia di consultare la documentazione tecnica. |