Linguaggio macchina (prof.Robino)

Transcript

Linguaggio macchina (prof.Robino)
Linguaggio macchina Von Neumann •  John Von Neumann (1903-­‐1957) –  Inventore dell’EDVAC (Electronic Discrete Variables AutomaFc Computer), la prima macchina digitale programmabile tramite un soIware basata su quella che poi sarà definita l’architeNura di Von Neumann Macchina di Von Neumann •  È il modello secondo il quale è organizzata la maggior parte dei moderni elaboratori •  ComponenF della macchina di Von Neumann: Il modello di Von Neumann: CPU •  La CPU o unità centrale di elaborazione è cosFtuita dai circuiF eleNronici capaci di leggere (dalla memoria centrale), decodificare (interpretare) ed eseguire (impartendo gli opportuni comandi alle varie parF del sistema) le istruzioni di un programma, una alla volta •  L’esecuzione delle istruzioni può comportare operazioni di elaborazione di daF (per esempio, operazioni aritmeFche) o di trasferimento di daF (per esempio dalla memoria centrale all’interfaccia di una periferica) Il modello di Von Neumann: memoria centrale •  La memoria centrale conFene le istruzioni di un programma e i daF necessari alla sua esecuzione •  Le periferiche sono le apparecchiature che consentono all’elaboratore di scambiare informazioni con il mondo esterno, mediante operazioni di ingresso (verso l’elaboratore) e uscita (verso l’esterno) Il modello di Von Neumann: periferiche •  Vengono considerate appartenenF alla macchina di Von Neumann solo interfacce verso le periferiche, mentre le periferiche sono considerate componenF separaF •  Nel modello di Von Neumann anche le memorie di massa sono incluse tra le periferiche, in quanto funzionalmente analoghe a queste ulFme, dal punto di vista dell’interazione con l’elaboratore Il modello di Von Neumann: bus •  Il bus di sistema assicura l’interconnessione tra gli elemenF della macchina di Von Neumann: tuX i trasferimenF di daF avvengono aNraverso il bus •  Il bus meNe in collegamento logico i due elemenF coinvolF nel trasferimento, in funzione dell’operazione da eseguire, mentre il collegamento fisico è sempre presente Il modello di Von Neumann •  Le fasi di elaborazione si succedono in modo sincrono rispeNo alla cadenza imposta da un orologio di sistema (clock) •  L’unità di controllo, contenuta dentro la CPU, durante ogni intervallo di tempo coordina le aXvità che vengono svolte dentro la stessa CPU o negli altri elemenF del sistema •  Il limite più evidente del modello di Von Neumann è la rigida sequenzialità del suo funzionamento •  Le evoluzioni di questo modello prevedono per lo più l’introduzione di forme di parallelismo nella esecuzione delle aXvità di elaborazione Funzionamento della macchina di Von Neumann: le istruzioni •  DaF e istruzioni di programma sono codificate in forma binaria, mediante sequenze finite di bit •  Un’istruzione codificata si compone di due parF: il codice operaFvo e uno o più operandi •  Il codice operaFvo individua, secondo una convenzione dipendente dalla specifica macchina, l’istruzione da eseguire •  Per ogni macchina esistono tanF codici operaFvi differenF quante sono le istruzioni presenF nell’insieme (set) delle istruzioni che la macchina è in grado di interpretare ed eseguire Funzionamento della macchina di Von Neumann: le istruzioni •  Gli operandi contengono, in una forma codificata dipendente dalla specifica macchina, le informazioni necessarie a reperire i daF sui quali l’istruzione deve operare •  Il linguaggio macchina è quindi streNamente legato all’architeNura della macchina Funzionamento della macchina di Von Neumann: la memoria centrale •  ConceNualmente la memoria centrale può essere vista come una sequenza di celle: ogni cella di memoria conFene una parola o word •  Le parole di un elaboratore hanno tuNe la stessa lunghezza, mentre elaboratori differenF possono avere parole di lunghezza differente •  Valori Fpici della lunghezza di parola: 8/16/32/64 bit •  SchemaFcamente la memoria può essere rappresentata come una tabella Funzionamento della macchina di Von Neumann: la CPU •  La figura mostra i componenF funzionali della CPU e le loro interconnessioni Unità di controllo (CU): è responsabile del prelievo delle istruzioni dalla memoria centrale, della loro decodifica e dell’invio di segnali di controllo che danno luogo alle operazioni necessarie per l’esecuzione dell’istruzione decodificata Funzionamento della macchina di Von Neumann: la CPU Orologio di sistema (clock): sincronizza le operazioni rispeNo ad una certa frequenza Funzionamento della macchina di Von Neumann: la CPU Unità aritmeFco-­‐
logica (ALU): effeNua le operazioni aritmeFche e logiche (eventualmente) richieste per l’esecuzione dell’istruzione Funzionamento della macchina di Von Neumann: la CPU •  La CPU conFene inoltre diversi registri. I principali sono: –  Registro daF (DR), lungo H bit –  Registro indirizzi (AR), lungo K bit –  Registro istruzione corrente (CIR), lungo H bit: conFene in ogni istante l’istruzione in esecuzione –  Contatore di programma (PC), lungo K bit: conFene l’indirizzo della successiva istruzione da eseguire –  Registro interruzioni (INTR), conFene informazioni sullo stato di funzionamento delle periferiche –  Registri contenenF operandi e risultato delle operazioni aritmeFco-­‐logiche (per esempio A e B) –  Registri di lavoro, contenenF daF ed istruzioni di uso frequente, oppure risultaF intermedi Funzionamento della macchina di Von Neumann: la CPU •  Registro di stato (SR), conFene indicazioni relaFve al risultato delle operazioni effeNuate dalla ALU. Tra queste: –  Bit di carry o riporto (indica la presenza di un riporto) –  Bit di zero (è 1 se c’è valore nullo in A) –  Bit di segno (è il segno del risultato di un’operazione) –  Bit di overflow (è 1 quando il risultato dell’ulFma operazione aritmeFca supera il massimo valore rappresentabile, cioè 2H se H è la lunghezza di A) •  Le moderne ALU sono in grado di eseguire operazioni molto sofisFcate oltre ovviamente le operazioni algebriche e logiche Funzionamento della macchina di Von Neumann: la CPU •  L’unità di controllo, dopo aver disposto il caricamento di A e B con i due operandi, invia alla ALU il codice relaFvo all’operazione da eseguire •  Al termine dell’esecuzione dell’operazione, che impegna un certo numero di periodi di clock, il registro A è caricato col risultato, mentre il registro B ha un contenuto non definito (tranne che per la divisione intera, per la quale B conFene il resto) Come si esegue un programma •  Un programma (sequenza di istruzioni in linguaggio macchina ricaricabile) viene caricato in memoria centrale •  Si alloca lo spazio per i daF necessari al programma •  La CPU estrae le istruzioni e daF dalla memoria centrale, le decodifica e le esegue uFlizzando registri interni (accesso veloce) •  L’esecuzione può comportare il trasferimento di daF in input e output tra memoria centrale e periferiche aNraverso il bus di sistema Programma in linguaggio macchina •  Le istruzioni sono codificate in bit ed inserite insieme agli altri daF nella memoria centrale istruzione= operazione di base sui registri e sulla RAM •  Un programma è una sequenza di istruzioni codificate •  Un programma viene interpretato sequenzialmente aNraverso il registro PC che idenFfica la prossima istruzione da eseguire •  Per rappresentare le cella della memoria (RAM) si usa la notazione M[i]= contenuto della cella con indirizzo i Il linguaggio macchina • 
• 
• 
• 
È scriNo in binario PermeNe di allocare memoria ConFene un set di istruzioni di base L’istruzione può avere formato: –  Senza operando –  Ad 1 operando –  A più operandi Esempio di linguaggio •  Codice operaFvo a 3 bit (8 combinazioni), 5 bit per indirizzo •  000 – nop •  001 – stop •  010 – add (indirizzo) + (registro accumulatore) •  011 – jump •  100 – write •  101 – read •  110 – load carica (indirizzo) in accumulatore •  111 – store meNe (accumulatore) in (indirizzo) Ciclo macchina per l’esecuzione di un’istruzione •  Si compone sempre di tre fasi: 1.  Fase di fetch 2.  Fase di decodifica 3.  Fase di esecuzione •  Supponiamo di aver caricato le istruzioni nella memoria a parFre dalla cella con indirizzo 0 Esecuzione tramite ciclo di fetch •  Inizializzazione: memoria 0 del registro PC •  Ciclo di fetch: 1.  Recupera il valore nella cella con indirizzo PC nella RAM e lo memorizza nel registro RIC (registro istruzione corrente) 2.  Somma 1 al valore contenuto in PC e lo memorizza in PC 3.  Decodifica il valore contenuto in RIC (estrae il codice operazione e il parametro) 4.  Esegue l’istruzione 5.  Torna al punto 1 a meno che l’istruzione non sia quella di ‘fine programma’ Fase di decodifica •  Vediamo che succede su RIC • 
• 
• 
• 
• 
• 
• 
• 
• 
• 
Esempio: codice operaFvo di 3 bit 000 – nop 001 – stop 010 – add 011 – jump 100 – write 101 – read 110 – load 111 – store Viene riconosciuta e selezionata l’istruzione da eseguire Fase di esecuzione •  Esempio RIC: 010|00011 •  00011 è l’indirizzo dell’addendo che viene sommato al contenuto del registro A della ALU. Occorre quindi: – 
– 
– 
– 
Trasferire il contenuto di 00011 in R1 LeNura Inviare registro daF all’ALU Dare il comando di somma •  Il risultato rimane in A •  Esempio RIC: 011|00001 •  Questa è l’istruzione di trasferimento del controllo (salto) incondizionato all’istruzione di indirizzo 00001 del programma in esecuzione. Quindi occorre trasferire il contenuto di 00001 in PC Osservazioni •  Il ciclo di fetch permeNe di eseguire programmi in modo sequenziale incrementando PC di 1 Prima istruzione RIC=M[0] Incremento PC Istruzioni seguenF RIC=M[1]. Ecc. •  Posso oNenere dei cicli cambiando il valore di PC tramite l’istruzione PC=… Linguaggio Assembly •  Un linguaggio simbolico molto vicino al linguaggio binario (macchina) ma più comodo –  I codici operaFvi binari sono sosFtuiF da codici simbolici, ad esempio ADD –  Esistono direXve per riservare celle di memoria –  Al posto degli indirizzi è possibile uFlizzare eFcheNe simboliche •  C’è una corrispondenza uno a uno fra i due linguaggi •  L’assembler quindi dipende dalla macchina C -­‐ assembly main(){int x, y; x=10; y=x;} SET r1, 10 imposta in r1 il valore 10 STORE X, r1
salva il contenuto di r1 in X LOAD r1,X carica la variabile X in r1 STORE Y, r1
salva r1 nella variabile Y For e while for (i=10;i>0; i-­‐-­‐){…//loop1 body} SET r0, 0 SET r1, 10 SET r2, 1 LOOP1TOP: … SUB r1, r1, r2
CMP r1, r0 JMP NEQ, LOOP1TOP
LOOP1END: while (x!=20){…//loop2 body} SET r2, 10 LOOP2TOP: LOAD r1, X
CMP r1, r2 JMP EQ, LOOP2END
…
JUMP LOOP2TOP LOOP2END: r1 per i r2 il valore da soNrarre loop1 body soNrae 1 da r1 conFnua fino a che r1=0 r2 condizione di terminazione carica x se uguale esci loop2 body IF if (x== 10) {…//then part1} else {…//else part 1} LOAD r1,X SET r2, 10
CMP r1,r2 JMP NEQ, ELSE1
… JUMP END1
ELSE1: … END1: carica x in r1 set r2 a 10 if r1<<r2, jump a else altrimenF fa then part 1 salta oltre else else part 1 Il programma assemblatore •  Determina gli indirizzi corrispondenF alle varie eFcheNe simboliche e costruisce la tabella dei simboli •  Istruzione per istruzione sosFtuisce la codifica binaria al codice operaFvo e alle eFcheNe. La codifica binaria dei numeri seguirà la convenzione della macchina (ad esempio modulo e segno etc.) •  Il programma in codice binario è quindi caricato in memoria per l’esecuzione •  A questo punto occorre assegnare al PC l’indirizzo della cella contenente la prima istruzione eseguibile Esercizio •  Codifica singola istruzione: •  Codici operaFvi istruzioni: –  0001: ADD sorgente (op1), des3nazione (op2) -­‐ ovvero somma quanto indicato da sorgente con il valore indicato in desFnazione e lo salva in desFnazione; ad es ADD R1, R2 significa somma ad R2 il valore di R1. –  0110: LOAD sorgente (op1), des3nazione (op2) -­‐ ovvero carica quanto indicato da sorgente in desFnazione; ad es LOAD 0001, R1 significa carica in R1 il valore 1. –  0111: STORE sorgente (op1), des3nazione (op2) -­‐ ovvero salva quanto indicato da sorgente in desFnazione; ad es STORE R1, 0001 significa salva nell’indirizzo di memoria 1 il valore contenuto in R1. Esercizio •  Modalità di riferimento degli operandi (vale sia per operando 1 che per operando 2): –  00: registro –  01: indirizzo di memoria –  10: valore immediato •  Dato il codice Assembler di un frammento di programma definire la corrispondente codifica in linguaggio macchina Esercizio LOAD 34, R1 (dove 34 rappresenta un valore numerico) LOAD 2, R2 (dove 2 rappresenta un valore numerico) ADD R1, R2 Soluzione 0110-­‐10-­‐100010-­‐00-­‐000001 0110-­‐10-­‐000010-­‐00-­‐000010 0001-­‐00-­‐000001-­‐00-­‐000010 Esercizio LOAD 2, R1 (dove 2 rappresenta un valore numerico) ADD 2, R1 (dove 2 rappresenta un valore numerico) STORE R1, 4 (dove 4 rappresenta un indirizzo di memoria) Soluzione 0110-­‐10-­‐000010-­‐00-­‐000001 0001-­‐10-­‐000010-­‐00-­‐000001 0111-­‐00-­‐000001-­‐01-­‐000100 Esercizio LOAD 4, R1 (dove 4 rappresenta un valore numerico) ADD R1, R2 STORE R2, 7 (dove 7 rappresenta un indirizzo di memoria) Soluzione 0110-­‐10-­‐000100-­‐00-­‐000001 0001-­‐00-­‐000001-­‐00-­‐000010 0111-­‐00-­‐000010-­‐01-­‐000111 Esercizio •  Dato il frammento in linguaggio macchina 0110-­‐10-­‐000001-­‐00-­‐000010 0001-­‐10-­‐000010-­‐00-­‐000010 0111-­‐00-­‐000010-­‐01-­‐000110 •  Al termine dell’esecuzione delle tre istruzioni che valori assumono il registro R2 e la cella di memoria di indirizzo 6? Soluzione •  Per prima cosa scriviamo le istruzioni in linguaggio assembler LOAD 1, R2 (dove 1 rappresenta un valore numerico) ADD 2, R2 (dove 2 rappresenta un valore numerico) STORE R2, 6 (dove 6 rappresenta un indirizzo di memoria) •  Sia R2 che la cella di memoria di indirizzo 6 alla fine dell’esecuzione delle tre istruzioni contengono il valore 3 Esercizio •  Dato il frammento in linguaggio macchina e dato che il registro R2 conFene il valore numerico binario 000011 0110-­‐10-­‐000001-­‐00-­‐000001 0001-­‐00-­‐000001-­‐00-­‐000010 0111-­‐00-­‐000010-­‐01-­‐000100 •  Al termine dell’esecuzione delle istruzioni quali valori assumono il registro R2 e la cella di memoria di indirizzo 4? Soluzione •  Scriviamo il codice assembler corrispondente LOAD 1, R1 (dove 1 rappresenta un valore numerico) ADD R1, R2 STORE R2, 4 (dove 4 rappresenta un indirizzo di memoria) •  Sia R2 che la cella di memoria di indirizzo 4 alla fine dell’esecuzione contengono il valore 4