coordinamento di Fernando Carello
di Francesco Sileno
Nota: in questo articolo ci sono dei riferimenti ipertestuali a termini tecnici definiti
nei precedenti Numeri di Beta. Nel collegare questi argomenti, si è assunto che la
directory del Numero 2 sia "../0295", del Numero 3 sia "../0395" e così via per gli altri Numeri.
Per esempio una struttura tipica potrebbe essere c:\beta\0295, c:\beta\0395, ecc., prendendo come nome di directory il numero contenuto nel nomefile di Beta,
oppure nel file di revisione.
I riferimenti sono attivi solo per installazione in locale.
I Registri
Il registro è una componente della CPU in grado di memorizzare a tempo intederminato
un valore, di dimensione pari alla parola che il processore stesso è in grado di elaborare.
Ad ogni registro è associato un nome mnemonico, ed è tramite tale nome che si
può accedere al suo contenuto.
Noi prendiamo in considerazione solo quelli in qualche modo accessibili all'utente, e
rimaniamo a quelli compatibili 8086 (per ora). Accanto ad ognuno di essi la
descrizione e un indicazione sull'uso che se ne fa in generale.
ES - Extra Segment - Dati
DS - Data Segment - Dati
CS - Code Segment - Codice
SS - Stack Segment - Stack
IP - Instruction Pointer - Codice
SP - Stack Pointer - Stack
BP - Base Pointer - Stack/Dati
DI - Destination Index - Dati
SI - Source Index - Dati
AX - AccumulatorCon r1:r2 intendo dire che per sapere l'indirizzo effettivo si devono tenere in considerazione entrambi i registri, vedremo poi in che modo.
BX - Base
CX - Counter
DX - Destination
CS:IP - Punta alla prossima istruzione da dover eseguire
SS:SP - Punta alla testa dello stack
| Bit: | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
| Flag: | OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||
DF - Direction
Indica se le istruzioni per uso su stringhe causano un auto-incremento o un
auto-decremento dei registri indice.
OF - Interrupt Enable
Quando questo flag è a 0, nessun interrupt, tranne i non mascherabili (NMI), può essere generato.
TF - Trap
Usato dai debugger, se il flag è attivo, dopo ogni istruzione viene
generato in INT 3
SF - Sign
0 per numeri positivi, 1 per numeri negativi.
ZF - Zero
Se il risultato dell'operazione è 0, il flag è attivo.
AF - Auxiliary Carry
Usato per istruzioni ad aritmetica-decimale, senga resti prestiti
intermedi.
PF - Parity Flag
Se il numero di bit con valore pari a 1 è pari nel risultato, il
flag è attivo.
CF - Carry Flag
Indica la presenza di riporto o di prestito nel risultato. Utile per numeri
multi-word.
I Bus
Se ci fosse solo la CPU, sarebbe un ben misero guadagno la possibilità di
fargli fare milioni di operazioni al secondo. Per questo è stata fornita di
una serie di canali per comunicare e interagire con l'esterno.
Tre sono le vie di comunicazione:
Facciamo un esempio: supponiamo una CPU con parola di 8bit, bus indirizzi di 16bit, che voglia leggere il byte precedentemente memorizzato all'indirizzo 534h. Quello che deve fare, in una versione estremamente semplificata e idealizzata, è:
CPU al Lavoro:
per ogni istruzione che la CPU esegue, si possono distinguere tre fasi di
elaborazione:
[CS]0000 +
[IP] =
----------
[CS][IP]
si avrebbero avute 32 linee di indirizzo, pari a 4Gb.
[CS]0 +
[IP] =
-------
20bit
la memoria indirizzabile fu 2^20 = 1Mb. Per questo motivo, la locazione
1234:5678 e la locazione 1000:79B8 sono la stessa di 1700:09B8. Tutte e tre
hanno come indirizzo effettivo il numero 179B8, ricordatevene quando
lavorate con segmenti e offset. Allo stesso modo, notate che un segmento
non può superare la dimensione di 64Kb, in quanto l'offset è a 16bit.
Questo tipo di indirizzamento viene usato quando la CPU si trova a lavorare
in MODO REALE
IRQ:
L'IRQ (Interrupt ReQuest) è un segnale che una periferica invia alla
CPU per segnalare una particolare situazione, il terminato trasferimento o
la disponibilità di dati. E' un segnale hardware, da non confondere
con gli interrupt software, indicati con INT. Per ogni IRQ ricevuto la CPU
genera un ben determinato INT:
| IRQ | INT | IRQ | INT | |
|---|---|---|---|---|
| 0 | 0x08 | 8 | 0x70 | |
| 1 | 0x09 | 9 | 0x71 | |
| 2 | 0x0A | 10 | 0x72 | |
| 3 | 0x0B | 11 | 0x73 | |
| 4 | 0x0C | 12 | 0x74 | |
| 5 | 0x0D | 13 | 0x75 | |
| 6 | 0x0E | 14 | 0x76 | |
| 7 | 0x0F | 15 | 0x77 | |
Gli XT avevano a disposizione soli gli IRQ 0..7, dagli AT in poi sono
diventati 15 (quasi).
Il fatto che in corrispondenza di un IRQ venga generato un INT, ci permette
di poter installare su tale INT una routine di gestione della periferca.
DMA:
Il DMA (Direct Memory Access) permette un trasferimento direttamente con
la memoria del PC, scavalcando la CPU, tramite un canale dedicato.
L'integrato controllore del DMA si impossessa del bus dati e bus indirizzi
ed effettua lo spostamento, rilasciandoli per brevi intervalli alla CPU in
modo da non bloccare del tutto il sistema. Al termine del trasferimento la
periferca genera un IRQ, che avvisa la CPU del completamento
dell'operazione. Come sopra, gli XT avevano 4 canali DMA (0..3), poi ne
misero 8.
Considerazioni:
Anzitutto, vediamo con una breve tabella quali sono i modi usati
dalle principali periferiche del PC:
| I/O | IRQ | DMA | |
|---|---|---|---|
| Tastiera | SI | SI | NO |
| Monitor | SI | [1] | NO |
| Floppy | SI | SI | SI |
| HD | SI | SI | SI(opt.) |
| Int. Seriale | SI | SI | NO |
| Int. Parallela | SI | SI | SI[2] |
| Scheda Sonora | SI | SI | SI |
| CD-ROM non IDE | SI | SI | SI(opt.) |
| Scheda di rete | SI | SI | SI(opt.) |
| Scanner | SI | SI | SI |
Buffo notare che i floppy hanno da sempre usato il trasferimento
DMA, al contrario degli HD che pure hanno un loro canale dedicato.
Quando entra in gioco il trasferimento di grandi quantità di dati,
o quando è importante la velocità con cui i dati devono essere
trasferiti, la differenza nell'usare il trasferimento tramite
porte di I/O o quello tramite DMA diventa notevole.
Nel trasferimento con porte di I/O, la CPU deve leggere/scrivere
un byte alla volta, entrando in un loop che termina col
trasferimento. Gli svantaggi che si hanno sono:
Un esempio pratico: il treferimento da/per memorie di massa quali gli Hard
Disk. Il metodo usato finora col DOS è il PIO, Polled I/O, ovvero quello
che fa uso delle porte di I/O. Per accellerare la capacità di trasferimento
dell'HD, si sono diminuiti i tempi necessari al singolo byte per essere
disponibile sulla porta, introducendo i vari PIO2, PIO3 e PIO4. Finchè si
sta in DOS, la cosa sembra essere meravigliosa. Non appena si passa a
sistemi multitask, ogni trasferimento di questo tipo rallenta notevolmente
tutto il sistema, e fortunatamente il recente diffondersi di sistemi
operativi multitasking (parlo di quelli veri) ha convinto i produttori di
hardware a rendere disponibile il trasferimento DMA anche per gli HD. Con
gioia di tutti noi, e con rabbia di chi usa gli SCSI, che ora non ha più
questo motivo per sfottere (ne ha sempre molti altri, però).
Per maggiori dettagli su questo argomento, fate riferimento all'articolo di Fernando apparso sul
numero 3 di Beta.
Bene, a questo punto ne sapete quanto può bastare per cominciare a
lavoricchiare. Un poco alla volta scenderemo nei dettagli, abbiate pazienza.
perifericamente,
Cthulhu
Copyright © 1996 Beta Working Group. Tutti i diritti riservati.