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è 2 H 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
Codifica singola istruzione: Esercizio 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