210 likes | 334 Vues
Il Linguaggio Macchina. Come funziona l’elaboratore?. Un programma (sequenza di istruzioni) viene caricato in memoria centrale Si alloca lo spazio per i dati necessari al programma
E N D
Come funziona l’elaboratore? • Un programma (sequenza di istruzioni) viene caricato in memoria centrale • Si alloca lo spazio per i dati necessari al programma • La CPU estrae le istruzioni e dati dalla memoria centrale, le decodifica e le esegue utilizzando registri interni (accesso veloce) • L’esecuzione può comportare il trasferimento di dati in input e output tra memoria centrale e periferiche attraverso il bus di sistema
Elaboratore Ideale di Von Neumann 0: decoder 1: 2: ACC : ALU PC RIC RAM CPU
Registri • Registro istruzione corrente (RIC) • contiene l’istruzione correntemente eseguita • Contatore di Programma (PC) • indirizzo della prossima istruzione da eseguire • Accumulatore (ACC) • Contiene valori utilizzati durante operazioni • Decoder • Decodifica codice istruzione
Istruzioni della Macchina • Le istruzioni della macchina sono codificate in forma numerica ed inserite insieme agli altri dati nella memoria centrale • Istruzione = operazione di base sui registri e sulla RAM • Codifica delle istruzioni = Elenco ordinato • Identificatore di un istruzione ~ Numero d’ordine
Rappresentazione RAM • Utilizzeremo la notazione • RAM[0] • RAM[1] • ... • Per rappresentare le celle della RAM(RAM[i]=contenuto della cella con indirizzo i)
Operatori e parametri • Alcune istruzioni richiedono un parametro che viene passato al momento della esecuzione • Per rappresentare codice + operandi possiamo utilizzare una codifica del tipo: • In decimale: CODICE*N+OPERANDO dove N dipende dalla grandezza delle celle di memoria • ad es. 2*1000+5=205 identifica l’istruzione2 con parametro N=5 • In binario: sequenza di bit composta da CODICE OPERANDO (es. 0010 0101)
Esempio di set istruzioni • Istruzione 1 con parametro N • Nuovo valore del reg. ACC = ACC + RAM[N] • Istruzione 2 con parametro N • Nuovo valore di RAM[N] = ACC • Istruzione 3 con parametro N • Se ACC=0 allora nuovo PC = N • Istruzione 4 con parametro N • Nuovo valore di ACC = RAM[N] • Istruzione 5: termina l’esecuzione
Programma in Linguaggio Macchina • Sequenza di istruzioni codificate • Un programma viene interpretato infatti sequenzialmenteattraverso il registro PC che identifica la prossima istruzione da eseguire • L’istruzione 3 permette di saltare in un qualsiasi punto del programma • Per capire meglio occore introdurre il ciclo di interpretazione dei programmi
Stato iniziale della macchina • Supponiamo di aver caricato le istruzioni nella RAM a partire dalla cella con indirizzo 0 • Inoltre supponiamo di avere a disposizione una tabella che ci permette di recuperare l’istruzione e i relativi parameteri a partire dal suo encoding (Codice*N+Parametro)
Esecuzione tramite ciclo di fetch • Inizializzazione: memorizza 0 nel 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. Esegui l’istruzione 5. Torna al punto 1 a meno che l’istruzione non sia quella di `fine programma’
Osservazioni • Il ciclo di fetch permette di eseguire programmi in modo sequenziale: • Prima istruzione RIC = RAM[0] • Incremento PC • Istruzione seguent RIC = RAM[1], ecc. • Posso ottenere dei cicli ottengono cambiando il valore del registro PC tramite l’istruzione 3 • …PC = …
Esempio di programma • Considerate la seguente conf. iniziale della RAM: • RAM[0]= 4004 • RAM[1]= 1005 • RAM[2]= 2004 • RAM[3]= 5 • RAM[4]= 21 • RAM[5]= 9 dove • Istr. 1: ACC ’ = ACC + RAM[N] • Istr. 2: RAM[N] ’ = ACC • Istr. 4: ACC ’ = RAM[N] • Istr. 5: termina esecuzione • (N=parametro) • Cosa fa il programma?
Soluzione • Il programma precedente esegue i seguenti passi: • Copia il valore della cella 4 (=21) nel reg. ACC • Somma il val. della cella 5 (=9) al valore in ACC e lo memorizza di nuovo in ACC (=30) • Copia il valore del reg. ACC nella cella 4 (=30) • Alla fine abbiamo che: • ACC e RAM[4] contengono 30 • RAM[5] contiene ancora 9
Operazioni cicliche • Per simulare un ciclo dobbiamo usare • Istr. 3: se ACC=0 allora PC ’=N • Istr. 6: PC ’ = N • Esempio ciclo che va da 5 a 0: • RAM[0] = 4004 (ACC=5 nota: programma come dato!) • RAM[1] = 3004 (se ACC=0 go to 4) • RAM[2] = 1006 (ACC’=ACC-1) • RAM[3] = 6001 (go to 1) • RAM[4] = 5 (halt) • RAM[5] = 1 • RAM[6] = -1
Nomi mnemonici • Per semplificare la lettura delle istruzioni associamo dei nomi mnemonici ai codici delle istruzioni • Il nostro primo esempio si potrebbe scrivere come • RAM[0]= LOAD 4 • RAM[1]= SUM 5 • RAM[2]= MOVE 4 • RAM[3]= HALT • RAM[4]= 21 • RAM[5]= 9 • LOAD rappresenta il codice 4 ecc.
Istruzioni come dati • Supponiamo che una cella della RAM contenga l’istruzione MOVE 4 • MOVE 4 rappresenta in realtà un numero • Nella nostra codifica decimale • Se codice di MOVE è 2 • 2*1000 + 4 = 2004 • Tale codifica semplifica i nostri calcoli ma non rispecchia i valori realmente memorizzati nella RAM dove si ragiona in binario
Istruzioni come dati • Le istruzioni in memoria sono in realtà codificate in binario • Ad esempio supponiamo di utilizzare un byte per il codice e uno per l’argomento • MOVE 4 viene rappresentato come0000001000000100 • Cioe’ 2*28+4 = 516 (28 rappresenta il numero di bit che aggiungiamo a destra del codice)
Istruzioni come dati • Indipendentemente dalla codifica è importante notare che • le istruzioni possono essere trattate come dati • MOVE 4 diventa 2004 • e i dati come istruzioni • Il numero 2004 diventa MOVE 4
Programmi automodificanti • La CPU applica il ciclo di fetch e decodifica in modo indiscriminato istruzioni o dati • Si possono definire programmi automodificanti che utilizzano dati come istruzioni • Nella macchina di Von Neumann alcuni problemi si possono risolvere solo con programmi automodificanti
Esempio • Un tipico problema in cui occorre modificare le istruzioni durante l’esecuzione • Allocare K celle di RAM consecutive con valori letti in ingresso • dove K è a sua volta un numero in ingresso (input)