L ambiente di simulazione SPIM

Documenti analoghi
L ambiente di simulazione SPIM

Assembly III SPIM: un ambiente di simulazione MIPS

Il simulatore SPIM SPIM

Le costanti Le modalità di indirizzamento L assembly del MIPS

Il linguaggio assembly

Programmi in Assembly

Modalità di indirizzamento

Assembly MIPS: gestione degli array strutture di controllo. A. Borghese, F. Pedersini Dipartimento di Informatica Università degli Studi di Milano

Architetture dei Calcolatori (Lettere. Installazione di SPIM. Interfaccia Grafica

Calcolatori Elettronici A a.a. 2008/2009

MIPS Instruction Set 2

Dal sorgente all eseguibile I programmi Assembly

Le procedure ricorsive Come eseguire un programma. Architettura degli Elaboratori e delle Reti, Turno I

Assembly V: Procedure annidate e recursive

Dal sorgente all eseguibile I programmi Assembly

Il Linguaggio Assembly: Le procedure

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

Procedure: esempi. Esempi: ricorsione fattoriale Fibonacci ordinamenti

[

Calcolatori Elettronici

Assembly MIPS: le procedure

26 April CHIAMATA A PROCEDURE PROCEDURE ANNIDATE PROCEDURA RICORSIVE I. Frosio

Linguaggio Assembler MIPS

Assembly MIPS: Istruzioni native e Pseudo-istruzioni Gestione di costanti in MIPS

15 April LABORATORIO 04 PROCEDURE STACK. CHIAMATA A PROCEDURE I. Frosio

System calls. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

System calls. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

Funzioni. Il modello console. Interfaccia in modalità console

Sommario Introduzione al linguaggio Assembly. Calcolatori Elettronici Prof. Gian Luca Marcialis. Le operazioni fondamentali

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Appunti per il corso di Laboratorio di informatica: Architetture

Assembly (3): le procedure

Laboratorio di Architettura degli Elaboratori

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Assembly (3): le procedure

Calcolatori Elettronici Parte X: l'assemblatore as88

Architetture dei Calcolatori

Allocazione dinamica della memoria - riepilogo

Assembly IV Le procedure

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Università degli Studi di Roma La Sapienza

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO XI.2015

MIPS! !

Addendum: istruzioni linguaggio macchina. Università di Bergamo - corso di Calcolatori Elettronici 1

Fondamenti di Informatica 2

Università degli Studi di Roma La Sapienza Architettura degli elaboratori II

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

System Calls, Register Spilling

MIPS Instruction Set 2

Calcolatori Ele,ronici Lezione 6 17/11/2011. Emiliano Casalicchio

Stringhe di caratteri

Linguaggio Assembler MIPS

Manualino minimale MIPS

Laboratorio 6 - MIPS 2

Calcolatori Elettronici

Architettura dei calcolatori e sistemi operativi. Set istruzioni e struttura del programma Direttive all Assemblatore.

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

costruttori e distruttori

dall argomento argomento della malloc()

Lezione laboratorio SPIM

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Istruzioni di trasferimento dati

Funzioni in C. Violetta Lonati

Architettura degli. Assemblatore Nomenclatura MARS. Dott. Franco Liberati

Il linguaggio assembly

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Progetto MIPS/SPIM. Descrizione. Questa tipologia di progetto consiste in

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Istruzioni di controllo del flusso

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

Gestione dei File in C

puntatori Lab. Calc. AA 2007/08 1

Introduzione al Linguaggio C

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Calcolatori Ele,ronici Lezione del 15/11/2012. Emiliano Casalicchio

Tecniche di traduzione da C ad assembly Note generali

ARCHITETTURA DEGLI ELABORATORI II - LABORATORIO

Breve riepilogo della puntata precedente:

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Esercizi. Assembly. Alessandro A. Nacci ACSO 2014/2014

Hazard sul controllo. Sommario


Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

Lezione 7 Sommatori e Moltiplicatori

Linguaggio C - Stringhe

I puntatori e l allocazione dinamica di memoria

Arduino: Programmazione

Calcolatori Elettronici

Linguaggio C. Fondamenti. Struttura di un programma.

Introduzione al linguaggio C Gli array

ESERCIZIO 1 Si consideri la seguente funzione f (A, B, C, D) non completamente specificata definita attraverso il suo ON-SET e DC-SET:

Le system call: fork(), wait(), exit()

Fetch Decode Execute Program Counter controllare esegue prossima

Transcript:

Architettura degli Elaboratori e delle Reti Lezione 14 L ambiente di simulazione SPIM Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 14 1/28 Il simulatore SPIM SPIM: A MIPS R2000/R3000 Simulator: http://www.cs.wisc.edu/~larus/spim.html Version 7.2 Unix or Linux system Microsoft Windows (Windows 95, 98, NT, 2000) Microsoft DOS Mac OS/X Riferimento: Patterson, Hennessy: Appendix A (Assemblers, Linkers, and the SPIM Simulator) L 14 2/28 1

Sommario Direttive Chiamate di sistema (system call) Esempi L 14 3/28 Direttive Le direttive danno delle indicazioni all assemblatore sul contenuto di un file (istruzioni, strutture dati, ecc.) Sintatticamente le direttive iniziano tutte con il carattere..data.text.align L 14 4/28 2

Direttive Direttive segmento dati: Definiscono regole di allocazione di dati in memoria.data <addr> Gli elementi successivi sono memorizzati nel segmento dati a partire dall indirizzo addr (facoltativo).asciiz str Memorizza la stringa str terminandola con il carattere Null(0x00).ascii str ha lo stesso effetto, ma non aggiunge alla fine il carattere Null.byte b1,...,bn Memorizza gli n valori b1,.., bn in byte consecutivi di memoria.word w1,...,wn Memorizza gli n valori su 32-bit w1,.., wn in parole (words) consecutive di memoria.half h1,...,hn Memorizza gli n valori su 16-bit h1,.., hn in halfword (mezze parole) consecutive di memoria.space n Alloca uno spazio pari ad n byte nel segmento dati L 14 5/28 Direttive (continua)... direttive: segmento dati.align n Allinea il dato successivo a blocchi di 2n byte: ad esempio:.align 2 =.word : allinea alla parola il valore successivo.align 1 =.half : allinea alla mezza parola il valore successivo.align 0 : elimina l allineamento automatico delle direttive.half,.word,.float,.double, fino a quando compare la successiva direttiva.data Direttive: segmento testo.text <addr> Memorizza gli elementi successivi nel segmento testo dell utente a partire dall indirizzo addr Questi elementi possono essere solo istruzioni o parole..globl sym Dichiara sym come etichetta globale (ad essa è possibile fare riferimento da altri file) L 14 6/28 3

Allineamento: esempio.word 1, 6, 0, 8, 2, 3, 8 1 6 0 8 2 3 8 1 word (4 bytes) Indirizzo successivo inserimento.half 1, 6, 0, 8, 2, 3, 8 1 6 0 8 2 3 8 1 word Indirizzo successivo inserimento L 14 7/28 Allineamento:.word + label array:.word 1, 6, 0, 8, 2, 3, 8 1 word (4 bytes) 1 6 0 8 2 3 8 Indirizzo successivo inserimento array rappresenta l indirizzo del primo elemento L 14 8/28 4

Sommario Direttive Chiamate di sistema (system call) Esempi L 14 9/28 System call Sono disponibili delle chiamate di sistema (system call) predefinite, che implementano particolari servizi Input/Output (ad esempio: stampa a video) Allocazione dinamica Ritorno al S.O. a fine programma Ogni system call ha: un codice degli argomenti (opzionali) dei valori di ritorno (opzionali) L 14 10/28 5

System call: output 1: print_int: stampa sulla console il numero intero che le viene passato come argomento; 2: print_float: stampa sulla console il numero in virgola mobile con singola precisione che le viene passato come argomento; 3: print_double: stampa sulla console il numero in virgola mobile con doppia precisione che le viene passato come argomento; 4: print_string: stampa sulla console la stringa che le è stata passata come argomento terminandola con il carattere Null (0); L 14 11/28 System call: input 5: read_int: legge una linea in ingresso fino al carattere a capo incluso (i caratteri che seguono il numero sono ignorati); 6: read_float: leggono una linea in ingresso fino al carattere a capo incluso (i caratteri che seguono il numero sono ignorati); 7: read_double: leggono una linea in ingresso fino al carattere a capo incluso (i caratteri che seguono il numero sono ignorati); 8: read_string: legge una stringa di caratteri di lunghezza $a1 da una linea in ingresso scrivendoli in un buffer ($a0) e terminando la stringa con il carattere Null (se ci sono meno caratteri sulla linea corrente, li legge fino al carattere a capo incluso e termina la stringa con il carattere Null); L 14 12/28 6

System call: controllo 9: sbrk alloca in memoria dati un blocco di memoria di n bytes, restituendo l indirizzo di inizio blocco; 10: exit interrompe l esecuzione del programma; L 14 13/28 System calls Nome Codice ($v0) Argomenti Risultato print_int 1 $a0 print_float 2 $f12 print_double 3 $f12 print_string 4 $a0 read_int 5 $v0 read_float 6 $f0 read_double 7 $f0 read_string 8 $a0,$a1 sbrk 9 $a0 $v0 exit 10 L 14 14/28 7

System calls Per richiedere un servizio ad una chiamata di sistema () occorre: Caricare il codice della nel registro $v0 Caricare gli argomenti nei registri $a0 $a3 oppure nei registri $f12 $f15, nel caso di valori in virgola mobile Chiamare la procedura: L eventuale valore di ritorno è caricato nel registro $v0 $f0, nel caso di valori in virgola mobile L 14 15/28 Uso dei registri: convenzioni Nome Numero Utilizzo $zero 0 costante zero $at 1 riservato per l assemblatore $v0-$v1 2-3 valori di ritorno di una procedura $a0-$a3 4-7 argomenti di una procedura $t0-$t7 8-15 registri temporanei (non salvati) $s0-$s7 16-23 registri salvati $t8-$t9 24-25 registri temporanei (non salvati) $k0-$k1 26-27 gestione delle eccezioni $gp 28 puntatore alla global area (dati) $sp 29 stack pointer $s8 30 registro salvato (fp) $ra 31 indirizzo di ritorno Registri general purpose Registri usati per le operazioni floating point Nome $f0-$f3 $f4-$f11 $f12-$f15 $f16-$f19 $f20-$f31 Utilizzo valori di ritorno di una procedura registri temporanei (non salvati) argomenti di una procedura registri temporanei (non salvati) registri salvati L 14 16/28 8

Sommario Direttive Chiamate di sistema (system call) Esempi L 14 17/28 Esempio # Programma che stampa Dammi un intero: # e che legge un intero.data prompt:.asciiz Dammi un intero:.text.globl main main: li $v0, 4 # $v0 codice della print_string la $a0, prompt # $a0 indirizzo della stringa # stampa la stringa li $v0, 5 # $v0 codice della read_int # legge un intero e lo carica in $v0 li $v0, 10 # $v0 codice della exit # esce dal programma L 14 18/28 9

Esempio # Programma che stampa: la risposta è 5 # data str:.asciiz la risposta è.text.globl main Main: li $v0, 4 # $v0 codice della print_string la $a0, str # $a0 indirizzo della stringa # stampa della stringa li $v0, 1 li $a0, 5 li $v0, 10 # $v0 codice della print_integer # $a0 intero da stampare # stampa dell intero # $v0 codice della exit # esce dal programma L 14 19/28 Esempio Calcolo somma dei quadrati da 1 a N: Codice C: int main(int argc, char* argv[]) { int i,n,t = 0; for (i=0;i<n;i++) t += i*i; printf( La somma vale da 0 a n vale %d\n, t ); return(0); } L 14 20/28 10

Esempio: codice Assembly # Programma che somma i quadrati dei primi N numeri # N e' memorizzato in t1.data.align 2 str:.asciiz "La somma da 0 a N vale ".text.globl main main: li $t1, 2 # N interi di cui calcolare la somma quadrati li $t6, 0 # t6 e' indice di ciclo indice di ciclo li $t8, 0 # t8 contiene la somma dei quadrati Loop: mul $t7, $t6 $t6 # t7 = t6 x t6 addu $t8, $t8, $t7 # t8 = t8 + t7 addi $t6, $t6, 1 ble $t6, $t1, Loop # if t6 < N stay in loop la $a0, str li $v0, 4 # print_string li $v0, 1 # print_int add $a0, $t8, $zero li $v0, 10 # $v0 codice della exit # esce dal programma L 14 21/28 Esempio 2 # Programma che copia tramite una procedura # gli interi positivi contenuti nell array (elem) # in un secondo array (pos_el) Inizializzazione Leggi gli interi Individua gli interi positivi Copia gli interi positivi Stampa gli interi positivi L 14 22/28 11

Esempio 2 Versione in linguaggio C main() { int i, k = 0, N=10, elem[10], pos_el[10]; } elem = leggi_interi(n); for (i=0; i<n;i++) if (elem[i] > 0) { pos_el[k] = elem[i]; k++; } printf( Il numero di interi positivi e %d,k); for (i=0; i<k; i++) printf( %d,pos_el[i]); exit(0); L 14 23/28 Esempio 2 estrazione di numeri positivi # Programma che copia tramite una procedura gli interi positivi # contenuti nell array (elem) in un secondo array (pos_el).data elem:.space 40 # alloca 40 byte per array elem pos_el:.space 40 # alloca 40 byte per array pos_el prompt:.asciiz "Inserire il successivo elemento \n" msg:.asciiz "Gli elementi positivi sono \n".text.globl main main: la $s0, elem # $s0 indirizzo di elem. la $s1, pos_el # $s1 indirizzo di pos_el li $s2, 40 # $s2 numero di elementi (in byte) # Ciclo di lettura dei 10 numeri interi move $t0, $s0 # indice di ciclo add $t1, $t0, $s2 # $t1 posizione finale di elem loop: li $v0, 4 # $v0 codice della print_string la $a0, prompt # $a0 indirizzo della stringa # stampa la stringa prompt L 14 24/28 12

Esempio 2 (cont.) # Lettura dell intero li $v0, 5 # $v0 codice della read_int # legge l intero e lo carica in $v0 sw $v0, 0($t0) addi $t0, $t0, 4 bne $t0, $t1, loop # memorizza l intero in elem # Fine della lettura, ora prepara gli argomenti per la proc. move $a0, $s0 # $a0 ind. array elem. move $a1, $s1 # $a1 ind. array pos_el move $a2, $s2 # $a2 dim. in byte dell array # Chiamata della procedura cp_pos jal cp_pos # restituisce il numero di byte # occupati dagli interi pos in $v0 L 14 25/28 Esempio 2 (cont.) # ciclo di stampa degli elementi positivi # Gli indirizzi in cui e racchiuso pos_elem vanno da $s2 a $t2 add $t2, $s1, $v0 move $t0, $s1 # $t2 ind. fine ciclo pos_el # $t0 ind. di ciclo loop_w: beq $t2, $t0, exit-main li $v0, 1 # $v0 codice della print_integer lw $a0, 0($t0) # $a0 intero da stampare # stampa dell intero addi $t0, $t0, 4 j loop_w exit-main: li $v0, 10 # $v0 codice della exit # esce dal programma L 14 26/28 13

Esempio 2 (procedure) # Questa procedura esamina l array elem ($a0) contenente # $a2/4 elementi # Resituisce in $v0, il numero di byte occupati dagli interi # positivi e in pos_el gli interi positivi cp_pos: addi $sp, $sp, -16 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $s3, 12($sp) move $s0, $a0 add $s1, $a0, $a2 move $s2, $a1 # allocazione dello stack # $s0 ind. ciclo su elem # $s1 ind. fine ciclo su elem # $s2 ind. ciclo su pos_el L 14 27/28 Esempio 2 (procedure) next: beq $s1, $s0, exit # se esaminato tutti gli elementi di elem # salta alla fine del ciclo (exit). lw $s3, 0($s0) # carica l elemento da elem addi $s0, $s0, 4 # posiziona sull elemento succ. di elem ble $s3, $zero, next # se $s3 0 va all elemento succ. di elem sw $s3, 0($s2) # Memorizzo il numero in pos_elem addi $s2, $s2, 4 # posiziona sull elemento succ. di pos_el j next # esamina l elemento successivo di elem exit: sub $v0, $s2, $a1 # salvo lo spazio in byte dei pos_el lw $s0, 0($sp) lw $s1, 4($sp) lw $s2, 8($sp) lw $s3, 12($sp) addi $sp,$sp,12 # deallocazione dello stack jr $ra # restituisce il controllo al chiamante L 14 28/28 14