Organizzazione della Memoria e Pinout dell'8086
Dai limiti dei registri a 16 bit alla segmentazione che sblocca 1 MB, fino ai 40 pin che collegano la CPU al mondo esterno: come l'8086 indirizza la memoria e comunica con il sistema.
1. Il problema dell'indirizzamento: 16 bit vs 1 MB
L'8086 ha un bus indirizzi a 20 bit → 1 MB indirizzabile, ma registri a soli 16 bit → max 64 KB. La segmentazione risolve questa discrepanza.
L'8086 ha un bus indirizzi a 20 bit — può quindi indirizzare fino a 1 MB di memoria (2²⁰ = 1.048.576 locazioni). Il problema è che i suoi registri sono a soli 16 bit, che permetterebbero di indirizzare al massimo 64 KB.
Come si risolve? Con la segmentazione della memoria — un meccanismo che combina due valori a 16 bit per produrre un indirizzo fisico a 20 bit.
Per ricordare il problema: pensa a un righello corto (16 bit) che deve misurare una strada lunga (20 bit). L'8086 usa due righelli sovrapposti: la base dice da dove parti, l'offset quanto avanti vai.
2. La segmentazione della memoria: Base e Offset
La memoria è divisa in segmenti — porzioni logiche destinate a funzioni specifiche. Ogni segmento può contenere al massimo 64 KB di dati (2¹⁶ locazioni, da 0000h a FFFFh).
Per indirizzare una qualsiasi locazione in memoria si usano due componenti:
Registro di segmento
L'indirizzo di partenza del segmento. Contenuto in CS, DS, SS, ES.
Spiazzamento
Distanza dall'inizio del segmento. In IP, SP, SI, DI, BP, BX...
Coppia Base:Offset
Es. B200:23F1 → indirizzo logico completo leggibile dal programmatore.
Indirizzo logico = BASE:OFFSET — es. B200:23F1. Due valori a 16 bit che insieme individuano una cella univoca nel MB.
3. Calcolo dell'indirizzo fisico
La CPU converte automaticamente l'indirizzo logico in indirizzo fisico a 20 bit prima di inviarlo sul bus indirizzi. La formula è:
Moltiplicare per 10h equivale ad aggiungere uno zero in fondo in esadecimale. Quindi B200h diventa B2000h — da 16 bit a 20 bit. Poi sommi l'offset. Zero fatica, zero binario!
Calcola l'indirizzo fisico di 1000:1234
Soluzione: 1000h ×10h = 10000h; 10000h + 1234h = 11234h. Se il prof chiede 2000:00A0 → 20000h + 00A0h = 200A0h. Provate ora con AB00:00FF → AB000h + 00FFh = AB0FFh
4. I quattro tipi di segmento: CS, DS, SS, ES
CS : Code Segment
Codice eseguibile. Coppia CS:IP punta all'istruzione corrente.
DS : Data Segment
Variabili e dati. Riferimento per la maggior parte degli accessi in Assembly.
SS : Stack Segment
Stack per chiamate e registri. Usato con SS:SP. Cresce verso il basso.
ES : Extra Segment
Spazio opzionale per dati aggiuntivi, stringhe e buffer destinazione.
IP, SP, SI, DI, BX, BP
IP per CS, SP/BP per SS, BX/SI/DI per DS, DI per ES nelle string ops.
Max 64 KB per segmento
Ogni segmento da 0000h a FFFFh. Possono sovrapporsi in memoria.
Non puoi fare MOV DS, 1000h direttamente! Le istruzioni Assembly non permettono mov immediato verso registri di segmento. Devi sempre passare per AX, BX, CX o DX. Il compilatore ti darà errore se sbagli.
5. Rilocazione dinamica dei programmi
La segmentazione rende i programmi rilocabili dinamicamente: il programma non è legato a una posizione fissa in memoria, ma può essere caricato ovunque ci sia spazio disponibile.
In un sistema in multiprogrammazione, il sistema operativo può spostare i programmi in memoria semplicemente aggiornando il valore della base nel registro di segmento — lo spiazzamento (offset) rimane invariato, e il codice sorgente non deve essere modificato.
Immagina il laboratorio scolastico: più programmi aperti (browser, IDE, Assembly). Il SO li sposta in RAM come tasselli. Con la segmentazione non deve ricompilare nulla: basta cambiare CS, DS, SS. Oggi con memoria virtuale il principio è evoluto, ma l'idea nasce qui!
6. I pin della CPU 8086: bus indirizzi e bus dati
Il microprocessore 8086 è un chip a 40 pin. Ogni pin ha un ruolo preciso nella comunicazione tra la CPU e il resto del sistema (memoria, dispositivi I/O, altri chip).
Bus indirizzi e bus dati multiplexati
Bus indirizzi
20 linee per indirizzare memoria e dispositivi → 1 MB.
Bus dati / indirizzi
16 linee condivise: prima indirizzo, poi dati. Risparmia pin.
Separa le funzioni
Chip esterno che cattura l'indirizzo all'inizio del ciclo bus.
I pin AD0–AD15 sono condivisi: nella prima parte del ciclo bus trasportano l'indirizzo, nella seconda i dati. Un latch (es. 8282) separa le due funzioni memorizzando l'indirizzo.
7. Pin di controllo e gestione interrupt
| Pin | Nome completo | Funzione |
|---|---|---|
| M/IO | Memory / I-O | Distingue memoria (alto) da dispositivo I/O (basso) |
| RD | Read | Attivo basso – CPU legge da memoria o dispositivo |
| WR | Write | Attivo basso – CPU scrive su memoria o dispositivo |
| CLK | Clock | Clock esterno – sincronizza tutte le operazioni |
| BHE | Bus High Enable | Abilita byte alto del bus – operazioni 8/16 bit |
| INTR | Interrupt Request | Richiesta interrupt mascherabile da periferiche |
| NMI | Non-Maskable Interrupt | Interrupt non mascherabile – errori critici, non ignorabile |
| INTA | Interrupt Acknowledge | Risposta CPU alla richiesta interrupt – ACK |
Un interrupt mascherabile (INTR) può essere disabilitato via software con CLI e riabilitato con STI. Utile durante sezioni critiche. Un interrupt non mascherabile (NMI) non può mai essere ignorato: segnala guasti hardware come errori di parità memoria o power failure. All'interrogazione: spiega CLI/STI!
Se M/IO=1 e RD=0 → la CPU sta leggendo dalla memoria. Se M/IO=0 e WR=0 → sta scrivendo su una porta I/O (es. stampante, sensore). BHE=0 + A0=0 → trasferimento a 16 bit su AD0-AD15. BHE=1 + A0=0 → solo byte basso (8 bit).
8. Riepilogo e verifica
🔬 Verifica rapida – mettiti alla prova
- Calcola l'indirizzo fisico di 1A2B:0F10 e spiega ogni passaggio.
- Perché MOV DS, 1234h genera errore di assemblaggio? Come si corregge?
- Quale coppia segmento:offset punta alla prossima istruzione? E allo stack top?
- Cosa succede sui pin M/IO, RD, BHE, A0 durante una read a 8 bit dal byte pari?
- Spiega la differenza tra INTR e NMI con un esempio pratico di tastiera vs errore di parità RAM.
- 1) 1A2B×10h=1A2B0h + 0F10h = 1B1C0h.
- 2) Non ammesso immediato verso SR → MOV AX,1234h / MOV DS,AX.
- 3) CS:IP e SS:SP.
- 4) M/IO=1 (memoria), RD=0, BHE=1, A0=0 = byte basso.
- 5) INTR tastiera mascherabile con CLI, NMI parità non mascherabile.
