Organizzazione della memoria e pinout

// obiettivi di apprendimento
Comprendere il meccanismo di segmentazione della memoria dell’8086
Calcolare l’indirizzo fisico a partire da un indirizzo logico base:offset
Distinguere i quattro tipi di segmento e il loro ruolo
Identificare i pin principali della CPU 8086 e la loro funzione
📄
Slides
Memoria e Pin della CPU 8086

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.

// problema
Registri a 16 bit
Max indirizzabile: 2¹⁶ = 64 KB
// soluzione
Segmentazione
Base + Offset → indirizzo a 20 bit = 1 MB

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:

BASE (Segmento)
L’indirizzo di partenza del segmento in memoria. Contenuto nel registro di segmento (CS, DS, SS, ES).
OFFSET (Spiazzamento)
La distanza della locazione dall’inizio del segmento. Contenuto nel registro di offset (IP, SP, SI, DI…).

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 finale
// come ricordarlo
Moltiplicare per 10h 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

CS
Code Segment
Contiene il codice eseguibile del programma. Usato insieme a IP per puntare all’istruzione corrente tramite la coppia CS:IP.
DS
Data Segment
Contiene le variabili e i dati del programma. È il segmento di riferimento per la maggior parte degli accessi alla memoria nei programmi Assembly.
SS
Stack Segment
Contiene lo stack — la memoria temporanea usata per le chiamate di funzione e il salvataggio dei registri. Usato con SP tramite la coppia SS:SP.
ES
Extra Segment
Spazio opzionale per dati aggiuntivi. Usato spesso per operazioni su stringhe e buffer, dove serve un secondo segmento dati come destinazione.
// attenzione — inizializzazione DS e ES
I registri 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 dati

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.

; 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

I 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

// bus indirizzi
A0 … A19
20 linee per indirizzare memoria e dispositivi — permettono di raggiungere 1 MB di spazio di indirizzamento
// bus dati (multiplexato)
AD0 … AD15
16 linee condivise con il bus indirizzi — trasferiscono dati tra CPU, memoria e dispositivi I/O
// bus multiplexato
I pin 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

PinNomeFunzione
M/IOMemory / I-ODistingue se l’operazione riguarda la memoria (alto) o un dispositivo I/O (basso)
RDReadAttivo basso — indica che la CPU sta leggendo dalla memoria o da un dispositivo
WRWriteAttivo basso — indica che la CPU sta scrivendo sulla memoria o su un dispositivo
CLKClockSegnale di clock esterno — sincronizza tutte le operazioni interne della CPU
BHEBus High EnableAbilita il trasferimento della parte alta del bus dati — permette operazioni a 8 o 16 bit
INTRInterrupt RequestRichiesta di interrupt mascherabile da dispositivi esterni
NMINon-Maskable InterruptInterrupt non mascherabile — la CPU non può ignorarlo (usato per errori critici)
INTAInterrupt AcknowledgeRisposta della CPU alla richiesta di interrupt — conferma la ricezione
// interrupt mascherabili vs non mascherabili
Un interrupt mascherabile (INTR) può essere disabilitato via software con l’istruzione 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)
  • DS ed ES devono 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
  • RD e WR indicano lettura/scrittura — M/IO distingue tra memoria e dispositivi I/O
  • INTR è mascherabile via software — NMI non può mai essere ignorato dalla CPU

Lascia un commento