Il problema dell’indirizzamento
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.
La segmentazione della memoria
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:
L’indirizzo logico è quindi sempre espresso come coppia BASE:OFFSET — ad esempio B200:23F1.
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 è:
; Formula generale
Indirizzo fisico = Base × 10h + Offset
; Esempio pratico: B200:23F1
B200h × 10h = B2000h ; aggiunge uno 0 in fondo → indirizzo a 20 bit
B2000h + 23F1h = B43F1h ; indirizzo fisico finale10h equivale ad aggiungere uno zero in fondo alla rappresentazione esadecimale. Quindi B200h diventa B2000h — da 16 bit a 20 bit. Poi si somma l’offset.I quattro tipi di segmento
IP per puntare all’istruzione corrente tramite la coppia CS:IP.SP tramite la coppia SS:SP.DS ed ES devono essere inizializzati dal programmatore. Non è possibile usare indirizzamento immediato — non si può scrivere MOV DS, valore direttamente. Il valore deve passare per un registro intermedio:MOV AX, @data ; carica l'indirizzo del segmento dati in AX
MOV DS, AX ; ora DS punta al segmento datiRilocazione 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.
; Stesso programma caricato in due posizioni diverse
; Caricamento A: base = 1000h
CS = 1000h → indirizzo fisico istruzione 1 = 10000h + offset
; Caricamento B: base = 5000h — stesso codice, posizione diversa
CS = 5000h → indirizzo fisico istruzione 1 = 50000h + offsetI pin della CPU 8086
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
AD0–AD15 sono condivisi tra bus dati e bus indirizzi. Nella prima parte del ciclo di bus trasportano l’indirizzo, nella seconda i dati. Un chip esterno chiamato latch (es. 8282) separa le due funzioni.Pin di controllo
| Pin | Nome | Funzione |
|---|---|---|
M/IO | Memory / I-O | Distingue se l’operazione riguarda la memoria (alto) o un dispositivo I/O (basso) |
RD | Read | Attivo basso — indica che la CPU sta leggendo dalla memoria o da un dispositivo |
WR | Write | Attivo basso — indica che la CPU sta scrivendo sulla memoria o su un dispositivo |
CLK | Clock | Segnale di clock esterno — sincronizza tutte le operazioni interne della CPU |
BHE | Bus High Enable | Abilita il trasferimento della parte alta del bus dati — permette operazioni a 8 o 16 bit |
INTR | Interrupt Request | Richiesta di interrupt mascherabile da dispositivi esterni |
NMI | Non-Maskable Interrupt | Interrupt non mascherabile — la CPU non può ignorarlo (usato per errori critici) |
INTA | Interrupt Acknowledge | Risposta della CPU alla richiesta di interrupt — conferma la ricezione |
CLI — la CPU lo ignora finché non viene riabilitato con STI. Un interrupt non mascherabile (NMI) non può mai essere ignorato: viene usato per segnalare errori hardware critici come guasti di memoria o problemi di alimentazione.Riepilogo
- L’8086 risolve il limite dei registri a 16 bit usando la segmentazione: indirizzo logico =
Base:Offset - L’indirizzo fisico si calcola come
Base × 10h + Offset— aggiungere uno zero esadecimale alla base porta a 20 bit - I quattro segmenti principali sono CS (codice), DS (dati), SS (stack), ES (extra)
DSedESdevono essere inizializzati dal programmatore tramite un registro intermedio — non con valore immediato- La segmentazione rende i programmi rilocabili dinamicamente — possono essere caricati in qualsiasi area di memoria
- L’8086 ha 40 pin: 20 per il bus indirizzi, 16 multiplexati per dati e indirizzi, più pin di controllo
RDeWRindicano lettura/scrittura —M/IOdistingue tra memoria e dispositivi I/OINTRè mascherabile via software —NMInon può mai essere ignorato dalla CPU