Upload
duongcong
View
215
Download
0
Embed Size (px)
Citation preview
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 r1 per i SET r2, 1 r2 il valore da soNrarre LOOP1TOP: … loop1 body
SUB r1, r1, r2 soNrae 1 da r1 CMP r1, r0 JMP NEQ, LOOP1TOP conFnua fino a che r1=0
LOOP1END: while (x!=20){…//loop2 body} SET r2, 10 r2 condizione di terminazione LOOP2TOP:
LOAD r1, X carica x CMP r1, r2 JMP EQ, LOOP2END se uguale esci … loop2 body JUMP LOOP2TOP
LOOP2END:
IF if (x== 10) {…//then part1} else {…//else part 1}
LOAD r1,X carica x in r1 SET r2, 10 set r2 a 10 CMP r1,r2 JMP NEQ, ELSE1 if r1<<r2, jump a else … altrimenF fa then part 1 JUMP END1 salta oltre else
ELSE1: … else part 1
END1:
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