Sistemi e Reti - Memoria e Pinout 8086 - Lezione 05 Modulo 2
Sistemi e Reti · Anno 3 · Modulo 2 · Lezione 05
✍ Autore: profgiagnotti · Materia: Sistemi e Reti

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.

// OBIETTIVI DI APPRENDIMENTO
✓Comprendere il meccanismo di segmentazione della memoria dell'8086 e perché è necessario per superare il limite dei 64 KB
✓Calcolare l'indirizzo fisico a 20 bit a partire dall'indirizzo logico Base:Offset con la formula Base × 10h + Offset
✓Distinguere i quattro segmenti CS, DS, SS, ES, le coppie con i registri di offset e le regole di inizializzazione
✓Capire la rilocazione dinamica dei programmi e il vantaggio in multiprogrammazione
✓Identificare i pin principali della CPU 8086: bus multiplexato AD0-AD15, bus indirizzi, pin di controllo e gestione interrupt INTR/NMI

1. Il problema dell'indirizzamento: 16 bit vs 1 MB

📌 Definizione da ricordare

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.

// PROBLEMA Registri a 16 bit Max indirizzabile: 2¹⁶ = 64 KB Troppo piccolo per 1 MB! // SOLUZIONE Segmentazione Base + Offset → 20 bit 1 MB raggiungibile ✓
💬 Tip del docente

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:

01 · BASE

Registro di segmento

L'indirizzo di partenza del segmento. Contenuto in CS, DS, SS, ES.

02 · OFFSET

Spiazzamento

Distanza dall'inizio del segmento. In IP, SP, SI, DI, BP, BX...

03 · LOGICO

Coppia Base:Offset

Es. B200:23F1 → indirizzo logico completo leggibile dal programmatore.

📌 Formula logica

Indirizzo logico = BASE:OFFSET — es. B200:23F1. Due valori a 16 bit che insieme individuano una cella univoca nel MB.

BASE = B200h Registro segmento ×10h → B2000h + OFFSET = 23F1h Distanza 23F1h = FISICO = B43F1h 20 bit → bus indirizzi 1 MB indirizzabile

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 è:

ASM · Calcolo indirizzo fisico
; 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 finale
💬 Trucco per ricordarlo

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!

🎯 Esempio in classe – esercizio veloce

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

CODE

CS : Code Segment

Codice eseguibile. Coppia CS:IP punta all'istruzione corrente.

DATA

DS : Data Segment

Variabili e dati. Riferimento per la maggior parte degli accessi in Assembly.

STACK

SS : Stack Segment

Stack per chiamate e registri. Usato con SS:SP. Cresce verso il basso.

EXTRA

ES : Extra Segment

Spazio opzionale per dati aggiuntivi, stringhe e buffer destinazione.

OFFSET TIPICI

IP, SP, SI, DI, BX, BP

IP per CS, SP/BP per SS, BX/SI/DI per DS, DI per ES nelle string ops.

DIMENSIONE

Max 64 KB per segmento

Ogni segmento da 0000h a FFFFh. Possono sovrapporsi in memoria.

ASM · Inizializzazione DS e ES
; ATTENZIONE: MOV DS, imm16 NON è permesso! ; Devi passare per un registro generaleMOV AX, @data ; carica indirizzo segmento dati in AX MOV DS, AX ; ora DS punta al segmento dati MOV ES, AX ; ES spesso inizializzato uguale a DS; Per CS e SS l'inizializzazione è gestita dal loader, ; ma puoi cambiarli con JMP FAR / PUSH + POP
⚠️ Errore comune – inizializzazione DS/ES

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.

Memoria 1 MB – segmenti sovrapposti CS – Codice – es. 1000:0000 → 10000h DS – Dati – es. 2000:0000 → 20000h (sovrapposto parziale) SS – Stack – es. 3000:0000 → 30000h ES – Extra – area opzionale

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.

ASM · Rilocazione dinamica
; 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 + offset ; Il codice non cambia, cambia solo CS!
🎯 Perché è utile?

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

A0-A19

Bus indirizzi

20 linee per indirizzare memoria e dispositivi → 1 MB.

AD0-AD15

Bus dati / indirizzi

16 linee condivise: prima indirizzo, poi dati. Risparmia pin.

LATCH 8282

Separa le funzioni

Chip esterno che cattura l'indirizzo all'inizio del ciclo bus.

📌 Bus multiplexato AD0-AD15

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.

CPU 8086 40 pin DIP A0-A19 (20) AD0-AD15 (16) M/IO RD WR INTR NMI INTA CLK + BHE + VCC GND

7. Pin di controllo e gestione interrupt

PinNome completoFunzione
M/IOMemory / I-ODistingue memoria (alto) da dispositivo I/O (basso)
RDReadAttivo basso – CPU legge da memoria o dispositivo
WRWriteAttivo basso – CPU scrive su memoria o dispositivo
CLKClockClock esterno – sincronizza tutte le operazioni
BHEBus High EnableAbilita byte alto del bus – operazioni 8/16 bit
INTRInterrupt RequestRichiesta interrupt mascherabile da periferiche
NMINon-Maskable InterruptInterrupt non mascherabile – errori critici, non ignorabile
INTAInterrupt AcknowledgeRisposta CPU alla richiesta interrupt – ACK
⚠️ Interrupt mascherabili vs non mascherabili – da non confondere

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!

🎯 Caso pratico pin

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).

✓L'8086 risolve il limite dei registri a 16 bit usando la segmentazione: indirizzo logico = Base:Offset
✓Indirizzo fisico = Base × 10h + Offset — aggiungere uno zero esadecimale alla base porta a 20 bit
✓Quattro segmenti: CS (codice, con IP), DS (dati), SS (stack, con SP), ES (extra per stringhe)
✓DS ed ES vanno inizializzati tramite registro intermedio: MOV AX,@data / MOV DS,AX
✓Segmentazione → programmi rilocabili dinamicamente: basta cambiare la base, offset invariato
✓40 pin: 20 bus indirizzi, 16 AD multiplexati con latch 8282, più controllo
✓RD/WR lettura/scrittura, M/IO memoria vs I/O, BHE per 8/16 bit, CLK sincronizza
✓INTR mascherabile con CLI/STI, NMI non mascherabile per errori critici, INTA conferma ricezione

🔬 Verifica rapida – mettiti alla prova

  1. Calcola l'indirizzo fisico di 1A2B:0F10 e spiega ogni passaggio.
  2. Perché MOV DS, 1234h genera errore di assemblaggio? Come si corregge?
  3. Quale coppia segmento:offset punta alla prossima istruzione? E allo stack top?
  4. Cosa succede sui pin M/IO, RD, BHE, A0 durante una read a 8 bit dal byte pari?
  5. Spiega la differenza tra INTR e NMI con un esempio pratico di tastiera vs errore di parità RAM.
✅ Soluzioni ragionate
  • 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.