Introduzione al microprocessore 8086

// obiettivi di apprendimento
Descrivere l’organizzazione interna di una CPU
Comprendere la suddivisione funzionale del microprocessore 8086
Classificare e utilizzare correttamente i registri
Collegare struttura hardware ed esecuzione delle istruzioni Assembly
📄
Slides
Introduzione al microprocessore 8086

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.

// bus dati
16 bit
Trasferisce 2 byte per operazione
// bus indirizzi
20 bit
Indirizza fino a 1 MB di memoria (2²⁰ locazioni)
// registri
14 reg.
Tutti a 16 bit, per elaborazione e gestione dati

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.

BIU — Bus Interface Unit
Gestisce tutto ciò che riguarda la comunicazione con la memoria e il bus.
Gestione bus dati e indirizzi
Calcolo indirizzi fisici
Coda prefetch (6 byte)
EU — Execution Unit
Qui avviene l’elaborazione vera e propria delle istruzioni.
Decodifica delle istruzioni
Operazioni ALU
Gestione registri e flag
// prefetch e pipeline
Il prefetch è una forma primitiva di parallelismo: mentre la EU esegue un’istruzione, la BIU carica già le successive dalla memoria. Questo anticipa il concetto moderno di pipeline ed è la ragione per cui la separazione BIU/EU è così rilevante dal punto di vista architetturale.

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)

RegistroNomeFunzione prevalenteSuddivisione 8 bit
AXAccumulatoreOperazioni aritmetiche e logiche — usato implicitamente da molte istruzioniAH + AL
BXBase RegisterIndirizzamento in memoria, base per calcoli di offsetBH + BL
CXContatoreContatore nei cicli e nelle operazioni su stringheCH + CL
DXDatiOperazioni I/O, moltiplicazioni e divisioni a 32 bitDH + DL
// suddivisione a 8 bit
Ogni registro generale può essere usato come un registro a 16 bit (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, 3

B — 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.

CS
Code Segment
Istruzioni del programma
DS
Data Segment
Dati del programma
SS
Stack Segment
Stack del programma
ES
Extra Segment
Dati aggiuntivi

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 = 10200h

Questo meccanismo permette di indirizzare fino a 1 MB di memoria pur avendo registri a soli 16 bit.

C — Registri puntatori e indici

RegistroNomeUtilizzo
SPStack PointerPunta alla cima dello stack — usato con SS
BPBase PointerAccesso ai parametri e variabili locali nello stack
SISource IndexSorgente nelle operazioni su array e stringhe
DIDestination IndexDestinazione 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.

FlagNomeSi attiva quando…
CFCarry FlagC’è un riporto o un prestito nell’ultima operazione
ZFZero FlagIl risultato dell’operazione è zero
SFSign FlagIl risultato è negativo (bit più significativo = 1)
OFOverflow FlagIl 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.

01
FETCH
La BIU preleva l’istruzione dalla memoria usando CS:IP
02
DECODE
La EU decodifica l’istruzione e identifica operandi e operazione
03
EXECUTE
L’ALU esegue, aggiorna registri e flag, IP avanza

Esempio completo commentato

MOV AX, 10   ; carica 10 in AX
MOV BX, 3    ; carica 3 in BX
ADD AX, BX   ; AX = AX + BX → AX = 13

Fase per fase su ADD AX, BX:

  1. La BIU preleva l’istruzione ADD AX, BX dalla memoria
  2. La EU decodifica — identifica operazione: somma, operandi: AX e BX
  3. I valori 10 e 3 vengono caricati dall’ALU
  4. L’ALU calcola 10 + 3 = 13
  5. Il risultato 13 viene scritto in AX
  6. I flag vengono aggiornati (ZF=0, SF=0, CF=0, OF=0)
  7. 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

Lascia un commento