LEZIONE 1: IL PROCESSORE 86/88 MICROPROCESSORI INTEL

LEZIONE 1: IL PROCESSORE 86/88
MICROPROCESSORI INTEL PER IL PC
 8080 (1974): CPU a 8bit, 2MHz, 64KB di memoria
indirizzabile;
 8086 (1978) e 8088 (1979): CPU a 8bit, 5-10MHz, 1MB
di memoria indirizzabile; bus a 16bit (8086) o a 8 bit
(8088). Scelta da IBM come CPU per il PC IBM originale.
 80286 (1982): CPU a 16bit, 8-12MHz, 16MB memoria
indirizzabile; instruction set di base uguale
all’8086/8088; organizzazione di memoria differente
ma complessa per garantire la compatibilità con i
vecchi chip.
 80836 (1985): CPU a 32bit, 16-33MHz, 4GB memoria
indirizzabile; compatibile con quanto prodotto
dall’8080 in poi.
 80486 (1989): CPU a 32bit, 25-100MHz, 4GB memoria
indirizzabile; organizzazione a pipeline; comprende
un’unità floating point e 8KB di cache su chip.
- Calcola gli indirizzi reali a 20bit sommando, in un
sommatore dedicato, l’indirizzo del segmento e
l’offset (entrambi a 16bit);
- Esegue trasferimento dati da e verso l’EU;
- Carica le istruzioni nella coda di istruzioni (prefetch).
Le istruzioni caricate dal BIU nella coda sono quelle che
seguono l’istruzione correntemente in esecuzione
nell’EU.
REGISTRI e l’IP(INSTRUCTION POINTER)
 REGISTRI GENERALI  Data Register (AX, BX, CX, DX).
 REGISTRI INDICE E PUNTATORE  Pointer Register
(SP, BP) ed Index Register (DI, SI).
 REGISTRI DI SEGMENTO  Si usano per puntare ai
quattro segmenti di memoria correntemente attivi.
 REGISTRI DI SISTEMA  IP (Instruction Pointer) e il
FLAG.
LA CPU INTEL 8086
È un microprocessore general purpose a 16bit di terza
generazione. Le caratteristiche principali sono:
 Capacità di indirizzamento di 1MB=220. Quindi bus
indirizzi a 20bit
 14 registri interni da 16bit
 Bus dati a 16bit
 7 modi di indirizzamento
 Set di istruzioni esteso (CISC)
Caratterist.
Bus indirizzi
Bus dati
Indirizzam.
8086/8088
20bit
16/8bit
1Mbyte
Registri
Piedini
16bit
40
80286
24bit
16bit
16Mbyte
1Gb virtual
16bit
68
Pentium
32bit
64bit
4G byte
64Tb virtual
32bit
267
 La memoria principale:
- 1MB=220=1.048.576 locazioni di memoria di 8bit
- Il primo byte ha indirizzo 0
- L’ultimo byte ha indirizzo FFFFFH
- Accesso a 4 blocchi di memoria di 64k byte ciascuno
(segmenti)
ESECUZIONE DI UN PROGRAMMA
Il programma è caricato in memoria centrale. Si compone
di due parti fondamentali: istruzioni (“codice”) e dati. Il
microprocessore inizia la lettura della prima istruzione a
un indirizzo noto di memoria; una volta letta, esegue
l’istruzione. Il microprocessore legge ed esegue
l’istruzione successiva in memoria, e così via. Alcune
istruzioni particolari, dette di trasferimento di controllo
(“salti”, chiamate a procedura, interruzioni, ...)
modificano arbitrariamente l’indirizzo da cui è letta la
successiva istruzione. Ogni istruzione può o meno fare
riferimento a dati in memoria; in tal caso, viene calcolato
l’indirizzo del dato ed eseguita un’operazione di lettura
e/o scrittura all’indirizzo di memoria.
 EXECUTION UNIT  Esegue le istruzioni; fornisce dati
e indirizzi al BIU (Bus Interface Unit); modifica registri
generali e il registro dei flag. In particolare:
- ALU, registri e bus interno a 16bit;
- EU non ha connessioni dirette con il bus di sistema
(con l’esterno). Gli indirizzi manipolati dall’EU sono
di 16bit.
- Il BIU effettua le operazioni che permettono di
accedere all’intero spazio di memoria disponibile.
 BUS INTERFACE UNIT  Esegue tutte le richieste
dell’EU che coinvolgono il mondo esterno, cioè i
trasferimenti di dati tra la CPU e la memoria o i
dispositivi di I/O. In particolare:
 INSTRUCTION POINTER (IP)  È un registro a 16bit;
viene gestito dal BIU; contiene, in ogni istante, l’offset
(cioè la distanza in byte) dell’istruzione successiva
dall’inizio del segmento codice corrente (CS); i
programmi non hanno accesso diretto all’IP, ma le
istruzioni lo modificano implicitamente; il program
counter classico (PC) coincide con CS:IP.
FLAGS
È un registro a 16bit contenente:
 6 flag di stato  vengono modificati dall’EU in base al
risultato delle operazioni logiche e aritmetiche.
 3 flag di controllo  settati o azzerati dal programma
al fine di modificare il comportamento della CPU.
 I rimanenti bit non sono utilizzati.
SF  segno (+ o -)
ZF  risultato zero
OF  overflow
CF  carry
AF  auxiliary carry
PF  parità del risultato
IF  interrupt enable
DF  direction
TF  trap
N.B.: Esiste un gruppo di istruzioni che permette al
programma di controllare il contenuto di tali flag a fini
decisionali.
GESTIONE DELLA MEMORIA
La memoria è divisa in: paragrafi e segmenti.
I paragrafi sono zone di memoria costituite da 16 byte
contigui non sovrapponibili. Il sistema può gestire fino a
64k paragrafi numerati a partire dalla locazione 00000h
di memoria. I segmenti sono zone di memoria costituite
da 64k byte contigui. Il sistema può gestire fino a 64k
segmenti; ogni segmento inizia in corrispondenza con un
paragrafo, ossia ad un indirizzo multiplo di 16. I segmenti
possono sovrapporsi (Overlapping Segments).
SEGMENTAZIONE INTEL 8086/88
Ciascun registro segmento punta a più spazi di
indirizzamento indipendenti: segmenti. I quattro registri
segmento puntano ai quattro segmenti correntemente
utilizzabili.
64k byte di codice - CS
64k byte di stack - SS
128k byte di dati - DS e ES
Per accedere al codice o ai dati contenuti in altri
segmenti, è necessario modificare i registri segmento in
modo opportuno.
Registri a 16bit  Numero massimo indirizzi = 216 = 64K
Memoria reale indirizzata = 220
ACCESSO
SIMULTANEO
MASSIMO
256K
INDIRIZZO FISICO
L’indirizzo fisico di una cella di memoria è espresso da 20
bit; non è quindi possibile un indirizzamento mediante un
solo registro a 16 bit.
Esso è infatti ottenuto mediante la somma di due
contributi:
 Il Segment Address: è l’indirizzo di testa del segmento
e viene ottenuto moltiplicando per 16 il numero del
segmento.
 l’Effective Address (EA): è l’indirizzo effettivo
all’interno del segmento, calcolato come offset
(spostamento) rispetto all’inizio del segmento stesso.
NB: la moltiplicazione per 16 può essere notevolmente
velocizzata da un semplice shift a sinistra di 4 posizioni
della rappresentazione binaria del numero.
I programmi utilizzano indirizzi formati da:
indirizzo del segmento
offset nel segmento
entrambi quantità di 16bit senza segno.
BIU converte la coppia segmento:offset in indirizzo fisico.
Ciò avviene moltiplicando l’indirizzo del segmento per 16
e sommando al risultato l’offset nel segmento.
STACK
È una memoria centrale gestita con un protocollo di tipo
LIFO (Last In First Out) definita dai registri SS e SP ed al
massimo di 64k byte.
 SS contiene l’indirizzo del segmento stack (Stack
Segment);
 SP contiene l’offset del top dello stack (Stack Pointer).
Lo stack cresce per decremento dello SP (andando dagli
indirizzi alti a quelli bassi): l’indirizzo di partenza dello
stack logico (contenuto in SS) è il top (non il bottom)
dell’area di memoria fisica riservata allo stack.
Le istruzioni che operano sullo stack trasferiscono due
byte per volta (una word).
 OPERAZIONE DI PUSH 
- SP -> SP-2
- Scrittura di una word al nuovo top
 OPERAZIONE DI POP 
- Lettura di una word dal top
- SP -> SP+2