SIM: un Semplice Interprete per il Mips

Vittorio Scarano

Dipartimento di Informatica ed Applicazioni "R.M. Capocelli"

Università degli Studi di Salerno

vitsca@dia.unisa.it


Indice

1. Introduzione

2.. I programmi MIPS per SIM

3. Come si usa SIM


[Indice]

1.Introduzione

1.1 A cosa serve il programma SIM

SIM è un semplice programma offerto come supporto per l'apprendimento della programmazione in Assembler MIPS nel corso di "Architetture" e "Fondamenti di Architetture" del Corso di Laurea in Informatica (ed Informatica Applicata) dell'Università di Salerno. Il programma permette la esecuzione di semplici programmi in Assembler MIPS (con alcune limitazioni per semplificarne lo studio) visualizzando il comportamento del programma sia per quanto riguarda l'accesso alla memoria che per quanto riguarda l'uso dei registri.

Il programma è attualmente disponibile gratuitamente in versione 1.0 all'indirizzo http://www.dia.unisa.it/~vitsca/SIM.

Il programma rappresenta un esempio di charityware (categoria inventata da me!) cioè di un programma disponibile gratuitamente (freeware) ma che stimola la donazione ad alcuni enti che si interessano di iniziative benefiche. La mia scelta è stata quella dell'UNICEF (http://www.unicef.it) e Emergency di Gino Strada (http://www.emergency.it). Entrambe le organizzazioni prevedono diverse modalità di donazione: da conto corrente postale, a carta di credito (on-line su un server sicuro) alla donazione via cellulare (con un SMS al costo di 1 euro).

Storia delle versioni

 

1.2 Installazione 

1.2.1. Requisiti per installazione

E' necessario avere installato correttamente il Java Development Kit (JDK) oppure il Run-time Environment (JRE) versione 1.5  presso http://java.sun.com/j2se/1.5.0/download.jsp (la versione 1.4.2 può anche andare bene, mentre la versione 1.3.x sembra che crei qualche problema). Altri ambienti Java nelle varie versioni e per diversi sistemi operativi sono disponibili al sito http://java.sun.com/j2se/ .

1.2.2 Installazione

Windows

Eseguire (con un doppio-click) il file di installazione SIM.msi che installerà uno shortcut sul desktop ed una directory SIM (sotto C:\Programmi) che conterrà:

Per disinstallare il programma, andare nel Pannello di controllo/Installazione Applicazioni e selezionare il programma e premere il bottone che ne permette la disinstallazione.

Linux

Il programma viene distribuito nel file SIM.zip che si deve scompattare in una directory (ad esempio,  /usr/local/bin/SIM sotto Linux). In questa directory si troverà

1.3 Altre informazioni

1.3 Altre informazioni

Potete spedire all'indirizzo vitsca@dia.unisa.it commenti e suggerimenti. Particolarmente gradite sono le segnalazioni di bug e di malfunzionamenti; in questo caso si prega di descrivere in maniera completa quello che è accaduto, allegando il programma MIPS che genera l'errore, informazioni sulla configurazione (versione del Sistema Operativo, versione del JDK usato, etc.).

[Indice]


[Indice]

2. I programmi MIPS per SIM

2.1 Istruzioni MIPS implementate

SIM è in grado di eseguire un insieme ristretto di istruzioni MIPS. Le istruzioni implementate sono:

2.2 Parametri all'interprete

I parametri all'interprete possono essere passati solamente sulle prime linee del programma (dette linee di direttiva). Una linea di direttiva inizia con il simbolo % (percento). Le direttive possibili sono:  

2.2.1 Direttiva per la memorizzazione. 

Questa direttiva serve a definire la locazione di memoria a partire dalla quale viene memorizzato il programma. Se presente, deve essere la prima direttiva del file. In caso non sia presente il programma verrà caricato a partire dalla locazione 0. La direttiva è preceduta da un carattere di % (percento) ed è

	% start = <locazione di memoria> 

Ad esempio per indicare che il programma che segue deve essere caricato a partire dalla locazione 2000 si deve inserire come prima linea:

	% start = 2000 

2.2.2 Direttive per la definizione di etichette (label)

E' possibile definire delle etichette (per usarle sia nelle istruzioni lw/sw sia come etichette per le istruzioni di salto condizionato o incondizionato) con la direttiva

	% <label> = <locazione di memoria> 

che definisce il valore della <label>  a <locazione di memoria>. Ad esempio la seguente istruzione definisce una etichetta ASTART con valore 1000:

        % ASTART = 1000 

 Ogni etichetta deve essere una stringa (nessuno spazio) che inizi con un carattere alfabetico, mentre la locazione di memoria deve essere un intero.

2.3 Descrizione del programma

E' possibile scrivere una breve descrizione del programma, facendo precedere alla prima istruzione linee precedute dal simbolo #. Queste linee verranno visualizzate nella finestra centrale, in basso a destra. Altri commenti su linea singola presenti all'interno del programma vengono ignorati e non visualizzati, né sulla finestra della descrizione né nella finestra relativa alle linee di programma. Ovviamente, invece, i commenti ad ogni singola istruzione sono visualizzati nel programma.

[Indice]


[Indice]

3. Come si usa SIM

Nota: le immagini di questa sezione si riferiscono alla versione 1.0 di SIM. In più, la versione 1.1 offre i due registri Hi e Lo per le operazioni in virgola mobile, situati dopo il registro 31 nella finestra dei registri. Inoltre, esiste (accanto alle etichette) una finestra che contiene la descrizione del programma.

3.1 La finestra principale di SIM

Appena lanciato, il programma si presenta con la seguente finestra:

Questa finestra rappresenta lo stato dell'interprete quando nessun programma è stato caricato. Distinguiamo, innanzitutto, le regioni della finestra che viene presentata all'utente. A sinistra e a destra si trova lo stato della macchina MIPS: a sinistra troviamo la lista dei 32 registri con i valori presenti nei registri, mentre a destra si trova invece la memoria a parole di 32 bit, quindi indirizzate con indirizzi "alla parola" (cioè multipli di 4). Al centro si trova, invece, la regione della finestra relativa al programma: in alto verrà mostrato il programma quando viene caricato mentre in basso si trova la tabella dei simboli del programma (valori delle etichette definite nel programma). Sopra alle regioni relative allo stato dell'interprete ed al programma MIPS si trova la regione relativa alla esecuzione del programma. Questa regione contiene alcuni pulsanti, che servono per poter eseguire il programma, per poterne eseguire solamente un passo (cioè una istruzione) e per poter fermare il programma, la indicazione del valore del Program Counter e lo status della macchina MIPS. Notate che tutte le regioni di questa finestra riflettono il fatto che nessun programma sia stato caricato: i pulsanti di esecuzione non sono attivi, e i registri, la memoria ed il Program Counter non visualizzano valori.

3.2 Esecuzione di un programma

Il Programma SIM è stato progettato come un simulatore del processore MIPS e quindi per scrivere i programmi MIPS è necessario utilizzare un qualsiasi editor di testo. Un programma MIPS deve essere scritto in un file che deve avere estensione .mips

3.2.1 Caricamento di un programma

Per poter caricare un programma si deve selezionare dal menù File la voce Open. Questo aprirà una finestra del tipo:

Come si vede la finestra visualizza i file di programmi MIPS (estensione .mips). Basta selezionare un file, oppure scriverne il nome nella casella apposita e premere il pulsante "Apri" per far caricare il programma. Per continuare in questo esempio, supponiamo che nel file esempio.mips sia scritto il seguente programma:

% start = 1000

% ASTART = 1600

	addi $9, $0, 0 		# inizializzazione indice

	addi $30, $0, 0 	# inizializzazione spiazzamento

	addi $31, $0, 4 	# limite del ciclo

Ciclo: 	sw $9, ASTART($30) 

	addi $9, $9, 1 		# incremento indice

	addi $30, $30, 4 	# incremento dello spiazzamento

	bne $9, $31, 1012 	# se non abbiamo terminato

Questo semplice programma usa la variabile nel registro $9 come indice che varia tra 0 e 4 (memorizzato nel registro $31) e scrive, ad ogni iterazione, il valore di $9 nelle locazioni 1600, 1604, 1608 e 1612. 

A questo punto lo schermo visualizzerà il programma caricato all'interno del simulatore MIPS come nella seguente figura:

Si può notare come ora la regione della finestra relativa allo stato della macchina (registri e memoria) sia stata inizializzata (con valori casuali). In particolar modo si noti come, secondo le specifiche MIPS, il registro $0 contiene il valore 0: qualsiasi operazione di modifica del registro $0 non otterrà alcun esito. Al centro, nella regione relativa al programma, compare il programma caricato (il cui pathname compare in alto) e la corrispondente tabella dei simboli in basso. Il Program Counter è inizializzato al valore 1000 (a causa del la direttiva all'interprete % start = 1000) ed indica la locazione della istruzione che verrà eseguita nel momento in cui eseguiremo il programma.  

3.2.2 Esecuzione normale

Per eseguire il programma, basta premere il pulsante Run e il programma verrà eseguito fino a quando il Program Counter punta oltre la locazione di memoria dell'ultima istruzione. Durante la esecuzione, lo status diventerà "Running.." ed il pulsante di "Stop" diventerà attivo (nel caso il vostro programma vada in loop!). Quello che appare una volta che abbiamo eseguito il programma sarà:

Da notare che, scorrendo la finestra della memoria (usando la apposita barra sulla destra) e posizionandoci sulla locazione 1600 e seguenti, il valore di queste locazioni di memoria è stato modificato dal programma. Inoltre, il Program Counter è stato rimesso nella posizione di inizio per permettere una altra esecuzione del programma oppure per potere eseguire il programma passo-passo, come vedremo nel prossimo paragrafo. 

3.2.3 Esecuzione passo-passo

E' possibile anche eseguire passo-passo il programma in modo da evidenziare il comportamento di ciascuna istruzione. A questo scopo, proviamo ad eseguire lo stesso programma esempio.mips visto in precedenza. Una volta caricato il programma (oppure al termine della esecuzione precedente) possiamo  premere il pulsante "Step" che fa eseguire la prima linea del programma (cioè la istruzione memorizzata nella parola il cui indirizzo è nel Program Counter). Ad ogni passo, viene evidenziata sia la prossima linea del programma da eseguire sia i registri e le locazioni di memoria eventualmente interessate dalla esecuzione della istruzione, in maniera da permettere di riconoscere immediatamente le eventuali modifiche apportate ai registri ed alla memoria. Ad esempio, eseguendo la prima istruzione del programma si ottiene la seguente schermata:

Possiamo notare che la esecuzione della prima linea del programma abbia messo a zero il registro $9 mentre la esecuzione della prossima linea di programma influenzerà i registri 0 e 31. Lo status indica che la macchina sta eseguendo un programma in modalità passo-passo (Status: Stepping). Inoltre, è possibile fermare la esecuzione del programma premendo il tasto Stop.

Un altro esempio è mostrato in basso (seconda iterazione del ciclo) e si vede che la prossima istruzione (alla locazione 1012) utilizzerà il registro $9 e $30 e la locazione 1604 (ASTART + il valore contenuto in $30).

 

3.3 Modifiche al valore dei registri e della memoria

E’ possibile modificare i valori presenti nei registri e nelle locazioni di memoria mediante editing (oltre che, ovviamente, tramite la esecuzione di istruzioni MIPS). Per editare, ad esempio, il valore di un registro basta selezionare (cliccando) il registro: la finestra del valore del registro selezionato prenderà lo sfondo bianco ed, a questo punto, è possibile introdurre un valore utilizzando la tastiera (le cifre inserite verranno inserite a partire dalla parte destra). I tasti e gli shortcut normalmente disponibili dal sistema operativo sono disponibili (ad esempio Backspace, Cut/Paste, etc.) così come è possibile, cliccando con il mouse, spostare il cursore in una certa posizione in modo da poter inserire cifre in quella posizione. Le stesse modifiche sono possibili per le locazioni di memoria (con le eccezioni presentate successivamente). Nel caso si introducano valori non corretti (caratteri non numerici, valori troppo grandi (in valore assoluto) la cornice del registro/memoria assume un colore rosso.

L’editing è possibile sia prima della esecuzione di un programma (mediante "Run") sia durante ogni passo della esecuzione passo-passo.

La modifica è possibile su tutti i registri e le locazioni di memoria con le seguenti eccezioni: 

[Indice]

3.4 La finestra di dettaglio della memoria

Selezionando il menù View è possibile ottenere la visualizzazione dettagliata sia della memoria che dei registri. Illustriamo qui quella relativa alla memoria, in quanto è simile quella dei registri.

La finestra che viene visualizzata è la seguente

Questa finestra mostra tutte le locazioni di memoria fornendo, oltre alla locazione e valore, anche il valore in binario della parola a  32 bit. Nella colonna successiva viene mostrato il formato della istruzione, se esso viene riconosciuto. Come si vede, ad esempio, solamente la locazione 20 presenta un valore che viene riconosciuto come una istruzione di formato I mentre le altre non sono riconosciute (ricordiamo che la memoria viene inizializzata con valori casuali). Per le istruzioni riconosciute viene anche fornita la interpretazione, secondo il formato, della stringa binaria evidenziando, quindi, i campi della istruzione. Infine, sempre solamente per le istruzioni riconosciute, viene fornita la istruzione MIPS corrispondente.

Come altro esempio (mostrato nella figura successiva), possiamo andare a vedere (dopo avere caricato il programma di esempio precedentemente visto esempio.mips) le locazioni di memoria che corrispondono alle locazioni di memoria dove abbiamo caricato il programma, vale a dire dalla locazione 1000 in poi. La finestra mostra le seguenti informazioni:

Si può notare che il programma viene caricato nelle locazioni di memoria specificate. Il programma (ricordiamo) è:
% start = 1000

% ASTART = 1600

	addi $9, $0, 0 		# inizializzazione indice

	addi $30, $0, 0 	# inizializzazione spiazzamento

	addi $31, $0, 4 	# limite del ciclo

Ciclo: 	sw $9, ASTART($30) 

	addi $9, $9, 1 		# incremento indice

	addi $30, $30, 4 	# incremento dello spiazzamento

	bne $9, $31, 1012 	# se non abbiamo terminato
e di fatto, si può notare come (ad esempio) la istruzione nella locazione 1012 contiene il valore 1600 che corrisponde all'utilizzo della etichetta definita ASTART all'interno del programma. Inoltre, la istruzione di branch presente nella locazione 1012 presenta correttamente il valore -4 nei 16 bit meno significativi: infatti per effettuare un salto alla locazione 1012 si memorizza il numero di word di cui si deve saltare, tenendo presente che il Program Counter già è estato incrementato e quindi, durante la esecuzione della istruzione, vale 1028. Quindi, il valore di -4 indica che si deve saltare di 4 word all'indietro, partendo da 1028 e quindi alla locazione 1012.