1
Corso di Laurea Triennale in InformaticaUniversità degli Studi di BariAnno Accademico 2009-2010
Architettura degli Elaboratori
Laboratorio
lez1: il processore 8086/88
Prof. S.Pizzutilo
I processori IntelTutta la famiglia dei processori Intel (x86) si basa ed e' compatibile con il primoprocessore di questo tipo: l'8086.L'8086 e' un processore a 16 bit quindi i suoi registri potranno contenere almassimo 16 bit di informazione.I processore successivi, quali l’80486, il Pentium ed il Pentium II sono processoria 32 bit.Intel rilascia a metà del 2000 anche il Merced a 64 bit.Per poter conoscere come funziona un processore Pentium e' necessario partire dalsuo bis-bis-nonno: 8086.
2
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 ivecchi chip.
I processori Intel a 32 bit80386 (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.
La CPU INTEL 80868086: microprocessore general purpose a 16 bit di terza generazioneLe 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)
3
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)
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 indirizzonoto di memoria; una volta letta, esegue l’istruzione· Il microprocessore legge ed esegue l’istruzione successiva in memoria, ecosì via· Alcune istruzioni particolari, dette di trasferimento di controllo (“salti”,chiamate a procedura, interruzioni, ...) modificano arbitrariamentel’indirizzo da cui è letta la successiva istruzione· Ogni istruzione può o meno fare riferimento a dati in memoria; in talcaso, viene calcolato l’indirizzo del dato ed eseguita un’operazione dilettura e/o scrittura all’indirizzo di memoria
4
La CPU è costituita da due blocchi funzionali:
1. Execution Unit (EU): esegue le istruzioni (fase di execute)2. Bus Interface Unit (BIU): - preleva le istruzioni (fase di fetch) - legge gli operandi - scrive i risultati
La CPU
5
• esegue le istruzioni• fornisce dati e indirizzi al BIU• modifica registri generali e registro flag
ALU, registri e bus interno a 16 bitEU non ha connessioni dirette con il bus disistema (con l’esterno)Quando l'EU deve eseguire una nuovaistruzione, la ottiene dalla coda gestita dalBIU e se la coda è vuota si pone in attesa;Se un'istruzione richiede di accedere allamemoria o a una periferica, EU richiede aBIU di ottenere o memorizzare il dato;
Indirizzi manipolati dall'EU sono di 16 bitIl BIU effettua le operazioni che permettonodi accedere all'intero spazio di memoriadisponibile
Execution Unit
esegue tutte le richieste dell'EU checoinvolgono il mondo esterno, cioè itrasferimenti di dati tra la CPU e la memoria o idispositivi di I/O· calcola gli indirizzi reali a 20 bit sommando,in un sommatore dedicato, l'indirizzo delsegmento e l'offset (entrambi a 16 bit)· esegue trasferimento dati da e verso l'EU· carica leistruzioni nella coda di istruzioni(prefetch)
Le istruzioni caricate dal BIU nella coda sonoquelle che seguono l'istruzione correntemente inesecuzione nell'EUSe l'EU esegue un'istruzione di salto, il BIUsvuota la coda e comincia a riempirla di nuovo apartire dal nuovo indirizzo; in questo caso, l'EUdeve aspettare che la BIU abbia acquisito lanuova istruzione da eseguire.
Bus Interface Unit
6
- Data Register (AX, BX, CX, DX)
Registri Generali
- Si usano per puntare ai quattro segmenti di memoriacorrentemente 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 ALAX Accumulatore nelle op aritmetiche
BH BLBX Base nei modi di indirizzamento
CH CLCX Contatore delle iterazioni nei Loop
DH DLDX Dati per la moltipl. e divis. di dati a 16 bit
SI: Indice di sorgenteDI: indice di destinazioneBP: Puntatore alla BaseSP: Puntatore allo Stack(si somma a SS per ottenere il TOP)
IP: Puntatore Istruzioni
FLAGS: Flag di stato
Usogenerale
registriindici epuntatori
CS: Segmento di programma(si somma a IP per ottenere il PC)DS: Segmento datiSS: Segmento StackES: Segmento Ulteriore
registrisegmento
registri disistema
7
· 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 lomodificano 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 alrisultato delle operazioni logiche e aritmetiche3 flag di controllo: settati o azzerati dal programma al finedi 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 chepermette al programma dicontrollare il contenuto di tali flaga fini decisionali
8
Gestione della memoriaPer comodità la memoria si può pensare divisa in
• Paragrafi• Segmenti
I paragrafi sono- zone di memoria costituite da 16 byte contigui. Il sistema può gestirefino a 64k paragrafi. (perche’?)- numerati a partire dalla locazione 00000h di memoria.I paragrafi non possono sovrapporsi.
I segmenti sono zone di memoria costituite da 64k byte contigui.Il sistema può gestire fino a 64k segmenti; ogni segmento inizia incorrispondenza con un paragrafo, ossia ad un indirizzo multiplo di 16.I segmenti possono sovrapporsi (Overlapping Segments).
Gestione della memoria
Memoria 0 16 32 48 64 80 …. 1M-32 1M-16 1M
paragrafi 0 1 2 64k-1segmenti
01
2
9
SegmentiI quattro registri segmento puntano ai quattro segmenticorrentemente utilizzabili.Ogni programma in esecuzione può accedere direttamente a:
64k byte di codice - CS64k byte di stack - SS128k 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
Segmentazione Intel 8086/88Ciascun registro segmento punta a più spazi di indirizzamento
indipendenti: segmenti
Registri a 16 Bit -> Numero massimo Indirizzi = 216 = 65.536 = 64 kMemoria 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 - CS64k byte di stack - SS128k byte di dati - DS e ES
Per accedere al codice o ai dati contenuti in altri segmenti, è necessario modificare iregistri segmento in modo opportuno
10
SegmentiI segmenti possono essere disposti in memoria in diversi modi; adesempio:
· contigui (segmenti A e B)· disgiunti (segmenti A e C)· sovrapposti parzialmente(segmenti B e C)· sovrapposti totalmente (segmentiE e F)
Una locazione della memoria fisica puòessere contenuta in più segmenti
Calcolo indirizzo fisicoL’indirizzo fisico di una cella di memoria è espresso da 20 bit;non è quindi possibile un indirizzamento mediante un solo registro a16 bit.Esso è infatti ottenuto mediante la somma di due contributi:- il Segment Address:è l’indirizzo di testa del segmento e viene ottenuto moltiplicando per16 il numero del segmento.- l’Effective Address (EA):è l’indirizzo effettivo all’interno del segmento, calcolato comeoffset (spostamento) rispetto all’inizio del segmento stesso.
NB: la moltiplicazione per 16 può essere notevolmente velocizzata da un sempliceshift a sinistra di 4 posizioni della rappresentazione binaria del numero.
11
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:offsetin indirizzo fisico
Ciò avviene moltiplicando l'indirizzo delsegmento per 16 e sommando al risultatol'offset nel segmento
Offset 16 bit +
Seg.Add. 20 bit
Eff.Add. 20 bit =
Indirizzo fisicoBIU ottiene la coppia segmento:offset da traslare, in modi diversi:1. Le istruzioni da eseguire vengono ricavate dal segmento codice corrente,pertanto l'indirizzo fisico della successiva istruzione è dato da: CS:IP, cioèCS*16+IP2. Le istruzioni che agiscono sullo stack utilizzano il segmento stack corrente:
- SS contiene l'indirizzo del segmento- SP contiene l'offset del top dello stack
Gli operandi che fanno riferimento alla memoria (variabili di programma) dinorma risiedono sul data segment corrente (DS)però, il programma può dire al BIU di utilizzare uno qualunque dei quattrosegmenti correntemente disponibili
L'offset della variabile viene invece calcolato dall'EU e dipende dalla modalità diindirizzamento specificata nell'istruzione
12
Stack• area di memoria gestita con un protocollo di tipo LIFO (Last In First Out)• realizzato in memoria centrale• definito dai registri SS e SP
In memoria possono coesistere più stack, ognuno al massimo di 64k byte seun programma oltrepassa per errore tale limite, ...
Un solo stack è quello corrente:• 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 aquelli bassi):l'indirizzo di partenza dello stack logico (contenuto in SS) non è il bottomdell’area di memoria fisica riservata allo stack
StackArea 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 aquelli bassi):l'indirizzo di partenza dello stack logico (contenuto in SS) non è il bottomdell’area di memoria fisica riservata allo stack.
13
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
ISA del Pentium IICompatibilità 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 usatiEnorme spazio di indirizzamento• 2^14 (=16.384) segmenti• 2^32 (indirizzi da 0 a 2^32-1) indirizzi per ogni segmentoLa maggior parte dei sistemi operativi usa un solo segmento di 2^32 byte raggruppati in parole da 4byte
Registri del Pentium II• 4 registri da 32 bit di uso generale (EAX, EBX, ECX, EDX), ciascuno utilizzabile anche comeregistri 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 indirizzamentoera limitata)• 1 registro da 32 bit come Program Counter (detto Instruction Pointer)• 1 registro da 32 bit per la PSW
14
AH ALAXBit ---------- 16 ------------- ------ 8 ----- ----- 8 -----
EAX
BH BLBX EBX
CH CLCX ECX
DH DLDX EDX
ESIEDIEBPESP
CSSSDSESFSGS
EIP
EFLAGS
; 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,AXfine: RETCalcolo ENDP ………………...MAIN ENDPCODE ENDSEND 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 alpiù da un blank;. L’istruzione non deve necessariamente iniziaredalla prima colonna;. L’istruzione può essere lunga al max 132
STRUTTURA PROGRAMMAASSEMBLY
15
SEGMENTIIn 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’iniziodi 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 eCODE
DATA ENDS CODE SEGMENT PARA PUBLIC ‘CODE’ MAIN PROC FAR …………………. MAIN ENDP CODE ENDS
Tipi di istruzioniSuddivisione 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
16
Tipi di istruzioni
Istruzioni su Istruzioni su dati nondati nontipizzatitipizzati: determinano: determinanooperazioni eseguibili suoperazioni eseguibili sututti i tipi di datitutti i tipi di dati1.1. IstrIstr. di trasferimento. di trasferimento
datidati2.2. IstrIstr. di traslazione e. di traslazione e
rotazionerotazione3.3. IstrIstr. di I/O. di I/O
–– Istruzioni su Istruzioni su dati tipizzatidati tipizzati::operano su un tipo di datioperano su un tipo di dati1.1. IstrIstr. aritmetiche. aritmetiche2.2. IstrIstr. logiche. logiche3.3. IstrIstr. di elaborazione stringhe. di elaborazione stringhe4.4. IstrIstr. di elaborazione indirizzi. di elaborazione indirizzi5.5. IstrIstr. di modifica della. di modifica della
sequenza di elaborazionesequenza di elaborazione
Come si costruiscono le istruzioni
Quale funzione?
•Load •and•store •or•add ...•sub
•Diretto•immediato•indicizzato•...La funzione scelta
con quale metododi indirizzamento?
Istruzionespecifica
17
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 unacostante o solo un particolare registro generale.
L'assembler dell'8086 non ha la caratteristica dell'ortogonalità,caratteristica che renderebbe la fase di apprendimentodell'assembler più veloce.