Il simulatore SPIM Architetture dei Calcolatori (lettere A-I) SPIM SPIM: un simulatore per eseguire programmi assembler scritti per processori MIPS32 Download e materiale relativo alla pagina Web http://www.cs.wisc.edu/~larus/spim.html (versione 7.1) Piattaforme: Sistemi Linux e Unix spim (a riga di comando), xspim (interfaccia grafica) Microsoft Windows (Windows 98, NT, 2000, XP) PCspim (interfaccia grafica) SPIM accetta un programma scritto in linguaggio assembler, completo di direttive e pseudoistruzioni SPIM dispone di un debugger che consente di inserire breakpoint e di eseguire a singoli passi Valeria Cardellini 1
Presenta 4 pannelli Interfaccia grafica Register display Registri generali Registri floating-point a precisione doppia Registri floating-point a precisione singola Segmento text Visualizza istruzioni sia di programma sia di sistema (caricate automaticamente quando parte SPIM) [0x00400000] 0x8fa40000 lw $4, 0($29) ; 140: lw $a0, 0($sp) Indirizzo esadecimale dell istruzione in memoria Codifica dell istruzione in esadecimale Descrizione mnemonica dell istruzione La linea dal file assembler Valeria Cardellini 2 Interfaccia grafica (2) Segmenti dati e stack Dati in memoria e nello stack Messaggi Per eseguire il programma Go Esegue l intero programma Single step Esegue una singola istruzione Multiple step Esegue un numero multiplo di istruzioni (specificato dall utente) Breakpoint Per bloccare l esecuzione del programma immediatamente prima dell esecuzione di una determinata istruzione Valeria Cardellini 3
Direttive Le direttive forniscono all assemblatore delle indicazioni sul contenuto di un file (istruzioni, strutture dati, ) Sintatticamente, le direttive iniziano con il carattere..data Gli elementi successivi alla direttiva sono memorizzati nel segmento dati Prima delle direttive è possibile specificare delle etichette, corrispondenti agli indirizzi di memoria in cui verranno allocati i dati Principali direttive per l allocazione di dati inizializzati.word w1,, wn Memorizza gli n valori su 32 bit w1,, wn in parole consecutive.byte b1,, bn Memorizza gli n valori b1,, bn in byte consecutivi.asciiz str Memorizza la stringa str terminandola con il carattere Null (.ascii str ha lo stesso effetto, ma non aggiunge Null) Valeria Cardellini 4 Direttive (2).space n Alloca uno spazio di n byte nel segmento dati.align n Allinea il dato successivo a blocchi di 2 n byte.globl sym Dichiara sym come etichetta globale (ad essa è possibile fare riferimento da altri file).text <addr> Memorizza gli elementi successivi nel segmento testo dell utente, a partire dall indirizzo addr (questi elementi possono essere solo istruzioni o parole) Valeria Cardellini 5
Direttive: esempio # Somma valori in un array.data array:.word 1,2,3,4,5,6,7,8,9,10 # dichiarazione array # array rappresenta l indirizzo del primo elemento.text.globl main main: li $s0,10 la $s1, array add $s2, $zero, $zero add $t2, $zero, $zero # load immediate (pseudoistruzione) # load address (pseudoistruzione) # contatore ciclo # somma loop: lw $t1, 0($s1) # accesso all array add $t2, $t1, $t2 # incremento somma addi $s1, $s1, 4 # $s1: indice del prossimo elemento addi $s2, $s2, 1 # incremento contatore ciclo bne $s2, $s0, loop # test termine ciclo Valeria Cardellini 6 System call Sono disponibili delle chiamate di sistema (system call) predefinite che implementano particolari servizi (ad es. stampa a video) Ogni system call ha: Codice (da caricare in $v0) Argomenti (opzionali, da caricare in $a0-$a3) Valori di ritorno (opzionali, in $v0) print_int Stampa sulla console il numero intero passato come argomento print_string Stampa sulla console la stringa passata come argomento, terminandola con il carattere Null read_int Legge una linea in ingresso fino al carattere a capo incluso I caratteri che seguono il numero sono ignorati Valeria Cardellini 7
System call (2) read_string Legge una stringa di caratteri di lunghezza $a1, scrivendoli in un buffer ($a0) e terminando la stringa con il carattere Null Se ci sono meno caratteri, li legge fino al carattere a capo incluso e termina con il carattere Null sbrk Restituisce il puntatore (indirizzo) ad un blocco di memoria exit Termina l esecuzione del programma Per richiedere un servizio ad una occorre: Caricare il codice della nel registro $v0 Caricare gli argomenti nei registri $a0-$a3 Eseguire L eventuale valore di ritorno è caricato nel registro $v0 Valeria Cardellini 8 System call: esempio # Programma che stampa: la risposta è 5.data str:.asciiz la risposta è.text li $v0, 4 la $a0, str li $v0, 1 li $a0, 5 li $v0, 10 # $v0 caricato con codice di print_string # $a0 caricato con indirizzo della stringa # stampa della stringa # $v0 caricato con codice di print_int # $a0 caricato con intero da stampare # $v0 caricato con codice di exit Valeria Cardellini 9