Generalità dei microprocessori Intel Microprocessori Set istruzioni 8086 Francesca Del Giorno III A “ E. Mattei” Anno 2006/2007 MICROPROCESSORE Un microprocessore è un componente elettronico digitale formato da transistor racchiuso in uno o più circuiti integrati. Uno o più processori sono utilizzati come CPU (control processing unit)che ha il compito di eseguire il ciclo istruzioni, in pratica è in grado di effettuare operazioni di lettura/scrittura della memoria centrale o dei registri di imput/output e di interpretare i codici. I microprocessori furono resi possibili dall’avvento dei microcomputer. Prima le CPU erano realizzate con circuiti a bassa scala di integrazione che erano in grado di contenere solo pochi transistor. Con il progresso della tecnologia si riuscirono a integrare abbastanza transistor in un circuito integrato da realizzare una CPU completa. Questo permise di ridurre i costi dei microprocessori. Dagli anni 70 in poi i microprocessori sono l’implementazione maggiormente utilizzata di CPU. GENERALITA' SUI MICROPROCESSORI Il microprocessore è costituito da un monocristallo di silicio estremamente puro, sezionato finemente, quindi trattato ad altissime temperature in forni che contengono vari tipi di impurità allo stato gassoso. Queste impurità devono legarsi alla struttura reticolare del cristallo, influenzando la sua capacità di condurre elettricità. Il silicio diventa così un semiconduttore ed è in grado quindi di resistere al passaggio di corrente elettrica in misura maggiore rispetto ai normali conduttori come il rame, ma non tanto quanto gli isolanti. Il microprocessore (o unità centrale di elaborazione, CPU) è una elaborata combinazione transistor, che si definisce circuito integrato. I circuiti integrati vengono adoperati nei più svariati settori, dall'amplificazione dell'audio al controllo delle funzioni di un microonde; i microprocessori si differenziano da altri circuiti integrati del genere per il fatto che le variazioni elettriche, conseguenti ai segnali d'ingresso, si verificano all'interno del processore stesso in base a particolari elaborazioni. L'unità centrale di elaborazione assolve due funzioni fondamentali: Governa tutte le operazioni del sistema, generando tutti i segnali occorrenti per il funzionamento degli altri circuiti ad esso collegati. Esegue tutti i calcoli aritmetici e logici. Il processore può essere quindi suddiviso in due parti: l'unità di controllo (Control Unit) e l'unità logico-aritmetica (ALU). E' presente inoltre una memoria locale, ovvero un insieme di dispositivi, detti registri, che vengono utilizzati per il controllo dell'esecuzione di un programma. L'elaborazione avviene con il reperimento da parte della Control Unit dell'istruzione da eseguire dalla memoria centrale all'indirizzo contenuto dal registro Program Counter. L'istruzione viene trasferita nel registro Instruction Register e il Program Counter viene incrementato in modo da puntare all'istruzione successiva. La CPU, dopo aver interpretato l'istruzione, emette segnali che producono la sua esecuzione. Se sono necessari calcoli, interviene l'ALU. Il procedimento appena descritto attraverso il quale la CPU esegue un'istruzione prende il nome di ciclo macchina, che può essere idealmente suddiviso in tre parti: Nella fase di fetch la Control Unit reperisce l'istruzione dalla memoria e viene incrementato il valore del Program Counter in modo da puntare all'istruzione successiva. Nella fase di decode l'istruzione viene interpretata: l'interpretazione può avvenire attraverso circuiti logici già predisposti al momento di costruzione del processore (logica cablata), oppure attraverso microistruzioni contenute in una apposita parte della ROM (logica microprogrammata). Nel primo caso, le funzioni eseguibili sono prefissate fisicamente e il sistema comporta una certa rigidità; nel secondo caso, l'interpretazione avviene cercando nella ROM la sequenza di passi elementari di cui l'istruzione da interpretare è a sua volta composta. Nella fase di execute la Control Unit invia segnali che rappresentano opportuni comandi per l'esecuzione. Il ciclo macchina è scandito da un temporizzatore o clock: un oscillatore al quarzo che emette segnali a intervalli di tempo regolari, all'interno di ciascuno del quale si svolge un passo elementare di funzionamento. La frequenza di oscillazione del clock determina la velocità della macchina. Tale velocità è misurata in megahertz, ovvero milioni di oscillazioni al secondo. Dato che ogni singola istruzione elementare richiede generalmente più di un ciclo di clock, la velocità dell'unità centrale può essere misurata anche in MIPS (Millions Instruction Per Second, milioni di istruzioni al secondo). Vediamo questi due valori riferiti ad alcuni processori Intel: 8080 8086 8088 80286 80386dx MHz 2 5 5 8 16 MIPS 0,64 0,33 0,33 1,2 6 Data di rilascio 4/74 6/78 6/78 2/82 10/85 80386sx 80486dx 80486sx 80486dx2 MHz 16 25 20 50 MIPS 2,5 20 16,5 40 6/88 4/89 4/91 3/92 Data di rilascio ARCHITETTURA RISC-CISC Esistono due tecnologie per la costruzione di microprocessori: la CISC (Complex Instruction Set Computer) e la RISC (Reduced Instruction Set Computer). I processori CISC sono quelli di uso più comune: la loro potenzialità viene incrementata attraverso l'aumento delle operazioni che riescono ad effettuare, andando a cercare addirittura dei macrocomandi comuni a molti linguaggi di programmazione. Aumentando così il numero dei comandi disponibili si ottiene maggiore potenzialità e conseguente semplicità di programmazione. Il concetto costruttivo di un microprocessore RISC è invece la forte riduzione del numero di istruzioni in modo da poter conciliare la velocità del microprocessore con l'esecuzione di queste. Il fine principale della struttura RISC è quello di produrre processori ad alta velocità e dal costo ridotto, data la minore complessità del progetto. Lo svantaggio della tecnologia RISC è il fatto che per i RISC sono stati sviluppati sistemi operativi a minore diffusione rispetto a quelli sviluppati per i CISC, come Windows. Inoltre è conseguenza dell'architettura RISC la maggiore complessità dei programmi: se i processori riconoscono una quantità molto bassa di istruzioni, il programmatore deve sopperire con il software per far svolgere ad essi operazioni complesse. In questo caso diventa praticamente obbligatorio studiare, di ogni porzione di codice, il metodo per renderla più veloce, e l'ottimizzazione del codice diviene di primaria importanza nello sviluppo dei sistemi di tipo Risc. I processori CISC più conosciuti sono la famiglia di CPU della Intel: 80286, 80386, 80486, Pentium. Altri costruttori, come AMD e Cyrix, producono microprocessori compatibili. I processori RISC si utilizzano da vari anni nelle cosiddette "stazioni di lavoro" (workstation), ossia elaboratori con prestazioni e prezzi superiori a quelli dei PC. Ogni casa produttrice di workstation ha sviluppato un proprio processore RISC. IBM per esempio utilizza il processore RISC 6000, la MIPS ha realizzato R3000 e R4000, SUN ha sviluppato lo SPARC, mentre la DIGITAL impiega l'ALPHA. Intel 1979 Alla fine del 1979 l'Intel presentò il suo nuovo microprocessore a 16 bit l' 8086 il primo di una famiglia che , insieme a quella sviluppata dalla motorola a partire dal 68000, avrebbe dominato il mercato dei sistemi operativi a 16 bit , sopratutto dopo l'introduzione ,a partire dal 1981 del PC IBM basato sull'8088 , immediata derivazione del 8086 .Il microprocessore 8086 è stato sviluppato dall'Intel come evoluzione dell'8080 di cui lo z-80 è la versione migliorata. Il successo della famiglia è stato poi confermato dagli sviluppi successivi dei personal computer IBM basati sui microprocessori Intel e precisamente sugli Intel 80286 80386 e 80486 derivati dall'8086 con un aumento progressivo delle prestazioni che ha portato per il PC 80486 ad una potenza di calcolo di decine di MIPS (milioni di istruzioni al secondo). Le caratteristiche principali dell'8086 sono, per l'hardware , il contenitore a 40 piedini , il multiplessaggio dei bus dati ,indirizzi e status ,la possibilità di indirizzare 1.048.576 locazioni di memoria , l'esistenza di due diversi modi di funzionamento ,minimo e massimo e il funzionamento cosiddetto a pipeline per cui mentre una parte della CPU sta eseguendo una istruzione ,un altra parte carica dalla memoria e inserisce in una coda di attesa una istruzione successiva.Per ciò che riguarda il software le caratteristiche principali sono un set di istruzioni e una disponibilità di modi di indirizzamento molto maggiore rispetto ai microprocessori a 8 bit (Zilog Z-80) e la possibilità di operare direttamente sui singoli byte , sulle parole a 16 bit (WORD) e sui blocchi. -8086SET DI ISTRUZIONI Per quanto riguarda l'inserimento delle istruzioni ci sono vari comandi a disposizione per ogni tipo di azione che dobbiamo far eseguire al programma: ISTRUZIONI DI SPOSTAMENTO DEI DATI; ISTRUZIONI LOGICHE; ISTRUZIONI ARITMETICHE; ISTRUZIONI DI MODIFICA DEL FLUSSO(SALTI E ITERAZIONI); ISTRUZIONI DI IMPUT/OUTPUT; ISTRUZIONI VARIE; Al primo gruppo appartengono quei comandi che reperiscono i propri operandi direttamente nelle locazioni di memoria indicate dalle istruzioni. ISTRUZIONI DI SPOSTAMENTO DEI DATI Per spostamento dati si intende il trasferimento di dati da una zona ad un altra di memoria o la diretta assegnazione di un valore a una locazione di memoria o a un registrassi può parlare di spostamento di valori da un registro a una locazione di memoria oppure il contrario, o ancora da un registro ad un altro registro. Le istruzioni di questa classe hanno una grande versatilità ma anche una grand d'uso.Nell'8086 si riesce con una sola istruzione a trasferire i dati tra le differen processore. Per questo tipo di processi si utilizza il comando: MOV <dest>,<sorg> nella quale MOV sta per move(sposta); ES.Caricare nel registro B il contenuto del registro A = MOV BH,AH ISTRUZIONI LOGICHE Le istruzioni logiche servono per effettuare le normali operazioni OR,AND,NOT,X OPERAZIO NE AND AND <op>,<op> OR OR <op>,<op> OR esclusioni XOR <op>,<op> logico logico (XOR) bit a bit a1) 8086 Negazione (comp. <op> NOT ES.OR CL,BL ES.XOR AX,BX ISTRUZIONI ARITMETICHE Le istruzioni aritmetiche classiche sono quelle di sottrazione, addizione,moltiplicazione alle quali vanno aggiunte alcune istruzioni specifiche del contesto come l'incremento e il decremento dell'operando. OPERAZIONE Somma di due operandi Somma di due operandi e riporto Sottrazione tra due operandi Sottrazione tra due op. e del riporto Confronto tra due operandi 8086 ADD<op>,<op> ADC <op>,<op> SUB <op>,<op> SBB <op>,<op> CMP <op>,<op> Cambio segno (compl. a due) NEG <op> Incremento dell'operando INC <op> Decremento dell'operando DEC <op> ISTRUZIONI DI MODIFICA DEL FLUSSO Le istruzioni di modifica del flusso sono tutte quelle istruzioni che modificano la normale esecuzione sequenziale del programma. Una modifica del flusso è data dalle istruzioni di salto e da quelle iterative. Le istruzioni di salto si dividono in due gruppi principali: salti condizionati; salti incondizionati; ISTRUZIONI DI SALTO INCONDIZINATO: Un'istruzioni di salto incondizionato verso l'indirizzo indicato, sono quelle che fanno in modo che l'esecuzione continui a partire dall'indirizzo segnalato ogni volta che essa viene incontrata.Una istruzione di questo tipo viene eseguita sempre e comunque dalla CPU, indipendendemente dalla posizione che occupa all'interno dalla seguenza d'istruzioni del programma. I salti incondizionati si dividono a sua volta in salti assoluti e salti relativi. SALTI INCONDIZIONATI ASSOLUTI: Un salto incondizionato assoluto ha la seguente forma: JUMP <ind> dove <ind> indica l'indirizzo della locazione di memoria che contiene l'istruzione a cui saltare. SALTI INCONDIZIONATI RELATIVI: Nei salti incondizionati relativi l'indirizzo a cui saltare è ottenuto sommando lo spiazzamento (<disp>) al contenuto di IP. Questo tipo di istruzione è rappresentata nel seguente modo: JUMPR <disp> Lo spiazzamento non corrisponde al numero di istruzioni da saltare, bensì al numero di byte da saltare. ISTRUZIONI DI SALTO CONDIZIONATO: I salti condizionati vengono eseguiti solamente quando si verifica una determinata condizione: se quella condizione non si verifica la CPU ignora l'istruzioni di salto per proseguire il normale svolgimento del programma. Nell'istruzione si deve indicare sia la condizione per cui dovrà avvenire l'eventuale salto, sia la destinazione (in modo assoluto relativo) del salto. Una generica istruzione di salto condizionato ha una sintassi del tipo: JUMPC <cond>, <dest> Dove <cond> indica la condizione di salto e <dest> la destinazione (indirizzo spiazzamento) del salto. L'8086 non consente il salto assoluto perchè ha un numero di byte troppo inferiore rispetto allo Z-80. Nei salti condizionati relativi ( unico tipo di salto permesso nell'8086 ) la sintassi è del tipo: J <cond>, <disp> STRUTTURE DI CONTROLLO CONDIZIONALI E ITERATIVE Queste istruzioni servono per le strutture di salto più complesse Funzioni Istruzioni di controllo LOOP <disp> diverso da 0 salta se CX è LOOPZ <disp> oppure LOOPE <disp> salta se CX è diverso da 0 e il flag Z vale 1 LOOPNZ <disp>oppure LOOPNE <disp> salta se CX è diverso da 0 e il flag Z vale 0 ISTRUZIONI DI INPUT/OUTPUT Le istruzioni di questo gruppo sono quelle che consentono il trasferimento di informazioni tra periferiche e microprocessore sia in ingresso(da periferica a processore) che in uscita(da processore a periferica). OPERAZIONE input in <acc> dalla periferica di indirizzo <ind> input in <acc> dalla periferica con indirizzo nel registro DX Output nella periferica <ind> del valore di <acc> Output in periferica di indirizzo in DX del valore di <acc> 8086 IN <acc>,<ind> <acc>,DX <ind>,<acc> DX,<acc> IN OUT OUT ES. Trasferisci il dato dal registro XX alla periferica di indirizzo F5: OUT F5,A ISTRUZIONI VARIE Vista la varietà di questa classe ci limitiamo a commentarvi il gruppo di istruzioni più comuni e di uso frequente.Ci occuperemo in dettaglio delle istruzioni di scorrimento dei bit e commenteremo le istruzioni di gestione dei blocchi sequenziali di dati. ISTRUZIONI DI SCORRIMENTO Le istruzioni di questo gruppo permettono di far scorrere il byte,indicato come sorgente, di un bit alla volta verso destra o verso sinistra, secondo modalità differenti da istruzione a istruzione. Vi riportiamo nella seguente tabella un riepilogo delle istruzioni più comuni di questa classe: Operazione Rotazione a sinistra Rotazione a sinistra con riporto Rotazione a destra 8086 ROL <dest>,<cont> RCL <dest>,<cont> ROR <dest>,<cont> Rotazione a destra con riporto RCR <dest>,<cont> Shift a sinistra (aritmetico e logico) SAL <dest>,<cont> SHL <dest>,<cont> Shift a destra (aritmetico) SAR <dest>,<cont> Shift a destra (logico) SHR <dest>,<cont> Le istruzioni di scorrimento dei bit vanno suddivise in due gruppi: le istruzioni di rotazione e le istruzioni di shift. Le prime effettuano uno spostamento dei bit nella direzione indicata,per cui i bit traboccano da una estremità, ricompaiono circolarmente dall'altra. Le istruzioni di shift, effettuano modifiche o forzature legate al bit che trabocca durante lo scorrimento. GESTIONE DI BLOCCHI SEQUENZIALI DI DATI: In questo gruppo ritroviamo una serie di istruzioni che permettono di: Trasferire un blocco di dati da una zona di memoria in un'altra; Ricercare in un blocco di dati un valore contenuto in un registro sorgente. Queste istruzioni richiedono l'impostazione preventiva di alcuni registri,per cui non richiedono degli operandi indicati esplicitamente nell'istruzione. L'8086 è fornito di istruzioni che ci permettono di trasferire il blocco byte per byte o parola per parola,basta indicargli il segmento a cui facciamo riferimento.Le istruzioni seguono la seguente sintassi: MOVSB MOVSW Esse servono per trasferire un byte (MOVSB) e una parola (MOVSW) dalla locazione di indirizzo SI (spiazzamento) e DS (registro segmento) nella destinazione il cui indirizzo è composto da DI(spiazzamento) e da ES (registro di segmento). Se aggiungiamo al programma l'istruzione: REP e impostiamo CX al numero di byte da trasferire avremo un trasferimento dell'intero blocco.