1
Corso di Laurea Triennale in Informatica Università degli Studi di Bari
Architettura degli Elaboratori
Laboratorio
lez1: il processore 8086/88
Prof. S.Pizzutilo
Microprocessori INTEL per il PC 8080 (1974) • CPU a 8 bit, 6000 tr., 2MHz, 64KB di memoria indirizzabile; • simile al PDP-8, ma prodotto di massa. 8086 (1978) e 8088 (1979) • CPU a 8 bit, 29000 tr., 5-10MHz, 1MB di memoria indirizzabile; • bus a 16 bit (8086) o a 8 bit (8088); • scelta da IBM come CPU per il PC IBM originale. 80286 (1982) • 16 bit, 134'000 tr., 8-12MHz, 16MB memoria indirizzabile; • instruction set di base uguale a 8086 e 8088; • organizzazione di memoria differente, ma complessa per garantire la compatibilità con i vecchi chip.
I processori Intel a 32 bit 80386 (1985) • 32 bit, 275’000 tr., 16-33MHz, 4GB memoria indirizzabile; • ~ compatibile con quanto prodotto dall’8080 in poi. 80486 (1989) • 32 bit, 1.2M tr., 25-100MHz, 4GB memoria indirizzabile; •organizzazione a pipeline; • comprende un’unità floating point e 8KB di cache su chip.
2
La CPU INTEL 8086 8086: microprocessore general purpose a 16 bit di terza generazione Le caratteristiche principali sono: • Capacità di indirizzamento di 1 MB =220 -> address bus a 20 bit
• 14 registri interni da 16 bit • data bus a 16 bit • 7 modi di indirizzamento • Set di istruzioni esteso (CISC)
MEMORIA PRINCIPALE · 1 MB =220= 1.048.576 locazioni di memoria di 8 bit · il primo byte ha indirizzo 0 · l'ultimo byte ha indirizzo FFFFFH (?) Accesso a 4 blocchi di memoria di 64k byte ciascuno (segmenti)
3
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 (EU): esegue le istruzioni (fase di execute)
- preleva le istruzioni (fase di fetch) - legge gli operandi - scrive i risultati
4
• esegue le istruzioni • fornisce dati e indirizzi al BIU • modifica registri generali e registro flag - ALU, registri e bus interno a 16 bit - EU non ha connessioni dirette con il bus di sistema (con l’esterno) Quando l'EU deve eseguire una nuova istruzione, la ottiene dalla coda gestita dal BIU e se la coda è vuota si pone in attesa; Se un'istruzione richiede di accedere alla memoria o a una periferica, EU richiede a BIU di ottenere o memorizzare il dato; - Indirizzi manipolati dall'EU sono di 16 bit - Il BIU effettua le operazioni che permettono di accedere all'intero spazio di memoria disponibile
Execution Unit
- BIU esegue tutte le richieste dell'EU che coinvolgono i l mondo esterno, cioè i trasferimenti di dati tra la CPU e la memoria o i dispositivi di I/O - calcola gli indirizzi reali a 20 bit
sommando, in un sommatore dedicato, l'indirizzo del segmento e l'offset (entrambi a 16 bit)
- 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 Se l'EU esegue un'istruzione di salto, il BIU svuota la coda e comincia a riempirla di nuovo a partire dal nuovo indirizzo; in questo caso, l'EU deve aspettare che la BIU abbia acquisito la nuova istruzione da eseguire.
Bus Interface Unit
5
- Data Register (AX, BX, CX, DX)
Registri Generali
- Si usano per puntare ai quattro segmenti di memoria correntemente attivi
Registri di Segmento
- IP: Instruction Pointer - FLAG
Registri di Sistema
• Pointer Register (SP, BP) • Index Register (DI, SI)
Registri Indice e Puntatore
Bit ---------- 16 ------------- AH AL AX Accumulatore nelle op aritmetiche
BH BL BX Base nei modi di indirizzamento
CH CL CX Contatore delle iterazioni nei Loop
DH DL DX Dati per la moltipl. e divis. di dati a 16 bit
SI: Indice di sorgente DI: indice di destinazione BP: Puntatore alla Base SP: Puntatore allo Stack (si somma a SS per ottenere il TOP)
IP: Puntatore Istruzioni
FLAGS: Registro di stato
Uso generale
registri indici e puntatori
CS: Segmento di programma (si somma a IP per ottenere il PC)
DS: Segmento dati SS: Segmento Stack ES: Segmento Ulteriore
registri segmento
registri di sistema
6
• registro a 16 bit • 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.
Instruction Pointer (IP)
Registro a 16 bit 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
FLAGS
Esiste un gruppo di istruzioni che permet te a l programma d i controllare il contenuto di tali flag a fini decisionali
7
Gestione della memoria
Memoria 0 16 32 48 64 80 …. 1M-32 1M-16 1M
paragrafi 0 1 2 64k-1 segmenti
0 1 2
La memoria è divisa in • Paragrafi • 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
Registri a 16 Bit -> Numero massimo Indirizzi = 216 = 65.536 = 64 k Memoria reale indirizzata = 1.048.576 = 1.024 = 220
Paragrafo (16 byte ) 64 k CODICE 0150H
ACCESSO CS 0150 H SIMULTANEO DS 4200 H 64 k DATI 4200H MASSIMO
= SS 9CD0 H 256 K ES B000 H 64 k STACK 9CD0H 64 k EXTRA B000H Segmenti max di 64 k che iniziano in qualsiasi punto della memoria e possono sovrapporsi.
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
8
Calcolo 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.
Indirizzo fisico I programmi utilizzano indirizzi formati da: · indirizzo del segmento · offset nel segmento
entrambi quantità di 16 bit 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
Offset 16 bit +
Seg.Add. 20 bit
Eff.Add. 20 bit =
9
Stack Area di 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.
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
10
ISA del Pentium II Compatibilità con architetture della famiglia 808x (real mode e virtual 8086 mode) Protected mode (vero Pentium II) prevede 4 livelli di privilegi controllati da bit della PSW • Livello 0 – kernel mode (sistema operativo) • Livello 3 – user mode (programmi applicativi) • Livelli 1 e 2 intermedi, raramente usati Enorme spazio di indirizzamento • 2^14 (=16.384) segmenti • 2^32 (indirizzi da 0 a 2^32-1) indirizzi per ogni segmento La maggior parte dei sistemi operativi usa un solo segmento di 2^32 byte raggruppati in parole da 4 byte
Registri del Pentium II • 4 registri da 32 bit di uso generale (EAX, EBX, ECX, EDX), ciascuno utilizzabile anche come registri da 16 e 8 bit (es. AX 16 bit, AH+AL 8 bit) • 4 registri da 32 bit usati come puntatori - ESI – Source - EDI – Destination - EBP – Base Pointer (analogo a LV di IJVM) - ESP – Stack Pointer • 6 registri da 16 bit per l’uso dei segmenti (importanti quando la capacità di indirizzamento era limitata) • 1 registro da 32 bit come Program Counter (detto Instruction Pointer) • 1 registro da 32 bit per la PSW
AH AL AX
Bit ---------- 16 ------------- ------ 8 ----- ----- 8 ----- EAX
BH BL BX EBX
CH CL CX ECX
DH DL DX EDX
ESI EDI EBP ESP
CS SS DS ES FS GS
EIP
EFLAGS
11
; Somma degli elementi di un vettore ;=======SEGMENTO STACK=========== STACK SEGMENT PARA STACK 'STACK' DB 100h DUP(0) STACK ENDS ;;== ==SEGMENTO DATI=========== DATA SEGMENT PARA PUBLIC 'DATA' totale DB 10 ;Quanti numeri contiene il vettore vettore DB 3,5,2,0,3,9,7,2,1,1 ……………… msg2 DB ': $' DATA ENDS ;==========SEGMENTO CODICE======== CODE SEGMENT PARA PUBLIC 'CODE' MAIN PROC FAR ;----PROLOGO STANDARD------------ ASSUME CS:CODE PUSH DS XOR AX,AX PUSH AX MOV AX,data MOV ES,AX ASSUME ES:DATA MOV DS,AX ASSUME DS:DATA ;-------------MAIN---------------- CALL Calcolo CALL Output RET ;----------PROCEDURE----------- Calcolo PROC NEAR CMP totale,0 JE fine XOR CX,CX …………….. MOV somma,AX fine: RET Calcolo ENDP ………………... MAIN ENDP CODE ENDS END MAIN
STRUTTURA ISTRUZIONE ASSEMBLY 1. LABEL ( opzionale ) 2. CODICE OPERATIVO ( Istruzione o
pseudoistruzione )
3. OPERANDO ( Uno o più di uno ) 4. COMMENTO ( Preceduto da ; ) . Questi quattro elementi devono essere separati al più da un blank; . L’istruzione non deve necessariamente iniziare dalla prima colonna; . L’istruzione può essere lunga al max 132
STRUTTURA PROGRAMMA ASSEMBLY
SEGMENTI In programma ci devono essere almeno 3 definizioni di segmento. - STACK riserva spazio per lo STACK. - DATA contiene le variabili del programma. - CODE contiene istruzioni del programma. Nome del segmento Specifica che il segmento deve cominciare dall’inizio
di un paragrafo standard ( 16 byte ) in memoria. STACK SEGMENT PARA STACK ‘STACK’ DB 1024 SUP ( 0FFH ) Per specificare lo Stack ………………. STACK ENDS DATA SEGMENT PARA PUBLIC ‘DATA’ VAR 1 DB
………………………. Per le definizioni del segmento DATA e CODE
DATA ENDS CODE SEGMENT PARA PUBLIC ‘CODE’ MAIN PROC FAR …………………. MAIN ENDP CODE ENDS
12
Tipi di istruzioni Suddivisione funzionale delle istruzioni:
• trasferimento dati • shift e rotazione • aritmetiche
• vettori booleani • elaborazione indirizzi • elaborazione di stringhe • modifica sequenza
• interi binari • reali • decimali
• istruzioni su dati tipizzati • istruzioni su dati non tipizzati
• salti condiz. e incondizion. • iterazione o loop • salti a subroutine • salti a procedure
• istruzioni general-purpose • istruzioni special-purpose
Tipi di istruzioni
Istruzioni su dati non tipizzati: determinano operazioni eseguibili su tutti i tipi di dati 1. Istr. di trasferimento
dati 2. Istr. di traslazione e
rotazione 3. Istr. di I/O
– Istruzioni su dati tipizzati: operano su un tipo di dati 1. Istr. aritmetiche 2. Istr. logiche 3. Istr. di elaborazione stringhe 4. Istr. di elaborazione indirizzi 5. I s t r. d i mod i f i ca de l l a
sequenza di elaborazione
13
Come si costruiscono le istruzioni
Quale funzione?
• Load •and • store •or • add ... • sub
• Diretto • immediato • indicizzato • ... La funzione scelta
con quale metodo di indirizzamento?
Istruzione specifica
FORMATO ISTRUZIONI
E' indifferente l'uso di lettere maiuscole o minuscole. Il tipo di operandi ammessi varia da istruzione a istruzione. Esistono istruzioni che ammettono come operando solo una costante o solo un particolare registro generale. L'assembler dell'8086 non ha la caratteristica dell'ortogonalità, caratteristica che renderebbe la fase di apprendimento dell'assembler più veloce.