Panoramica del microprocessore 8086
Il microprocessore 8086, introdotto da Intel nel 1978, ha segnato l’inizio dell’architettura x86 — la stessa alla base di tutti i PC moderni. Nonostante l’età, resta il modello didattico di riferimento per capire come funziona davvero un processore.
La sua architettura è di tipo CISC (Complex Instruction Set Computing) con un ISA compatibile con tutti i modelli successivi della famiglia Intel — questo ne ha determinato la diffusione globale nei Personal Computer.
Organizzazione interna — BIU e EU
La struttura interna dell’8086 è divisa in due unità funzionali che lavorano in parallelo. Questa separazione è il primo esempio concreto di pipeline nella storia dell’architettura x86.
I registri — la memoria interna della CPU
I registri sono aree di memoria interne alla CPU, enormemente più veloci della RAM. Nell’8086 sono tutti a 16 bit e rappresentano il vero spazio di lavoro del processore: ogni operazione Assembly agisce direttamente su di essi.
A — Registri generali (General Purpose)
| Registro | Nome | Funzione prevalente | Suddivisione 8 bit |
|---|---|---|---|
AX | Accumulatore | Operazioni aritmetiche e logiche — usato implicitamente da molte istruzioni | AH + AL |
BX | Base Register | Indirizzamento in memoria, base per calcoli di offset | BH + BL |
CX | Contatore | Contatore nei cicli e nelle operazioni su stringhe | CH + CL |
DX | Dati | Operazioni I/O, moltiplicazioni e divisioni a 32 bit | DH + DL |
AX) oppure come due registri separati a 8 bit (AH per la parte alta, AL per la parte bassa). Questo consente piena flessibilità nelle operazioni sia a 8 che a 16 bit.Esempio pratico con AX:
; Carica il valore 5 in AX
MOV AX, 5
; Somma 3 ad AX — risultato: AX = 8
ADD AX, 3B — Registri di segmento
L’8086 usa un modello di memoria segmentato: la memoria non viene indirizzata con un unico valore, ma con la combinazione di un segmento e un offset. I registri di segmento contengono l’indirizzo base di ciascuna area di memoria.
L’indirizzo fisico viene calcolato secondo la formula:
; Formula indirizzo fisico
Indirizzo fisico = Segmento × 16 + Offset
; Esempio: CS = 1000h, IP = 0200h
Indirizzo fisico = 1000h × 10h + 0200h = 10200hQuesto meccanismo permette di indirizzare fino a 1 MB di memoria pur avendo registri a soli 16 bit.
C — Registri puntatori e indici
| Registro | Nome | Utilizzo |
|---|---|---|
SP | Stack Pointer | Punta alla cima dello stack — usato con SS |
BP | Base Pointer | Accesso ai parametri e variabili locali nello stack |
SI | Source Index | Sorgente nelle operazioni su array e stringhe |
DI | Destination Index | Destinazione nelle operazioni su array e stringhe |
D — Instruction Pointer (IP)
L’IP contiene l’offset della prossima istruzione da eseguire all’interno del segmento di codice. Non è mai accessibile direttamente dal programmatore — viene aggiornato automaticamente dalla CPU dopo ogni istruzione.
La coppia CS:IP identifica in modo univoco l’istruzione corrente in memoria.
E — Registro FLAGS
Il registro FLAGS memorizza lo stato del processore dopo ogni operazione. Ogni bit rappresenta una condizione specifica — i flag vengono aggiornati automaticamente dopo ogni operazione aritmetica o logica.
| Flag | Nome | Si attiva quando… |
|---|---|---|
CF | Carry Flag | C’è un riporto o un prestito nell’ultima operazione |
ZF | Zero Flag | Il risultato dell’operazione è zero |
SF | Sign Flag | Il risultato è negativo (bit più significativo = 1) |
OF | Overflow Flag | Il risultato supera la capacità del registro (overflow) |
Esempio — ZF in azione:
MOV AX, 5
SUB AX, 5 ; AX = 0
; Dopo SUB:
; AX → 0
; ZF → 1 (risultato è zero)
; SF → 0 (non negativo)
; CF → 0 (nessun prestito)I flag sono fondamentali per i salti condizionati: istruzioni come JZ (Jump if Zero) o JNZ (Jump if Not Zero) leggono i flag per decidere se saltare o continuare l’esecuzione.
Il ciclo di esecuzione delle istruzioni
Ogni istruzione Assembly segue un ciclo preciso in tre fasi. Nell’8086 le prime due fasi sono gestite dalla BIU, la terza dalla EU — ed è proprio questa separazione che permette il parallelismo.
Esempio completo commentato
MOV AX, 10 ; carica 10 in AX
MOV BX, 3 ; carica 3 in BX
ADD AX, BX ; AX = AX + BX → AX = 13Fase per fase su ADD AX, BX:
- La BIU preleva l’istruzione
ADD AX, BXdalla memoria - La EU decodifica — identifica operazione: somma, operandi: AX e BX
- I valori
10e3vengono caricati dall’ALU - L’ALU calcola
10 + 3 = 13 - Il risultato
13viene scritto in AX - I flag vengono aggiornati (ZF=0, SF=0, CF=0, OF=0)
- L’IP avanza all’istruzione successiva
Riepilogo
- L’8086 (1978) è l’origine dell’architettura x86 — bus dati 16 bit, bus indirizzi 20 bit, 14 registri
- La struttura è divisa in BIU (gestione bus e prefetch) ed EU (esecuzione) — il primo esempio di pipeline
- I registri generali (AX, BX, CX, DX) sono lo spazio di lavoro principale — divisibili in parti a 8 bit
- I registri di segmento (CS, DS, SS, ES) permettono di indirizzare 1 MB con registri a 16 bit
- La coppia CS:IP identifica sempre l’istruzione corrente
- Il registro FLAGS riflette lo stato del processore dopo ogni operazione — abilitando i salti condizionati
- Ogni istruzione segue il ciclo Fetch → Decode → Execute