Assembly III SPIM: un ambiente di simulazione MIPS

Documenti analoghi
L ambiente di simulazione SPIM

Le costanti Le modalità di indirizzamento L assembly del MIPS

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

Il simulatore SPIM SPIM

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

Calcolatori Elettronici A a.a. 2008/2009

Università degli Studi di Roma La Sapienza

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

System Calls, Register Spilling

Appunti per il corso di Laboratorio di informatica: Architetture

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

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

[

MIPS Instruction Set 2

Università degli Studi di Roma La Sapienza

Il linguaggio Assembly

Architettura degli Elaboratori II - Laboratorio

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembler MIPS

Linguaggio Assembler MIPS

Assembler MIPS R2000/3000

Assemblatori, linker ed il simulatore SPIM. Università di Bergamo - corso di Calcolatori Elettronici

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

Università degli Studi di Cassino

Lecture 2: Prime Istruzioni

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Laboratorio di Architettura degli Elaboratori

Assembly. Motivazioni. Programmazione Assembly

Corso di Calcolatori Elettronici MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M.

Istruzioni assembler Istruzione N Registri

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly

U"lizzo della memoria (Indirizzamento, le2ura, scri2ura) Dire8ve Assembler in SPIM

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Stringhe e allocazione dinamica della memoria

Laboratorio di Architettura lezione 11. La scorsa lezione. Motivi? Word e bytes

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Assembler MIPS 32 Introduzione ai concetti e al simulatore SPIM

1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware.

Linguaggio C: introduzione

Calcolatori Elettronici

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Esercitazione 6. Array

Esercitazione di Calcolatori Elettronici Ing. Battista Biggio. Corso di Laurea in Ingegneria Elettronica. Capitolo 5 Linguaggio Assembly

Programmi per la macchina di Mano addizione di due numeri

Laboratorio di Architetture degli Elaboratori II (A.A )

L architettura di riferimento

Richiami sull architettura del processore MIPS a 32 bit

Architettura dei calcolatori e sistemi operativi. Sottoprogrammi e MIPS. Espressioni algebriche. Capitolo 2 P&H

Lezione 3 Assembly MIPS (2)

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

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

Programmazione modulare

Lezione4: MIPS e Istruzioni (1 Parte)

Scrittura formattata - printf

1. I registri del MIPS: convenzioni.

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Motivazioni. Assembly. Programmazione Assembly. Programmazione Assembly

ARCHITETTURA DI UN SISTEMA DI ELABORAZIONE

Calcolatori Elettronici A a.a. 2008/2009

Esercitazione 7 Interruzioni in PCSPIM Input/Output Chiamate di procedure

Sono tipicamente causati da dispositivi hardware. normale flusso di esecuzione viene interrotto, e la CPU passa a gestire l interrupt

ARCHITETTURA DEGLI ELABORATORI II - LABORATORIO

Laboratorio di Architettura lezione 5. Massimo Marchiori W3C/MIT/UNIVE

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Sistemi Operativi 1. Mattia Monga. 11 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Esercizi per il recupero del debito formativo:

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

SOLUZIONI DELLA PROVA SCRITTA DEL CORSO DI. NUOVO E VECCHIO ORDINAMENTO DIDATTICO 13 Luglio 2004

Il linguaggio C - Introduzione

Introduzione a GCC: GNU Compiler Collection

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 18 Febbraio Attenzione:

IL PRIMO PROGRAMMA IN C

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

I/O INTERATTIVO. scanf: quello che è indispensabile sapere printf: quello che è utile sapere

CALCOLATORI ELETTRONICI

Laboratorio di Architettura degli Elaboratori LabArch 2007 Terzo Quadimestre, a.a Docente: H. Muccini

Assembler MIPS R2000/R3000 Assembly I

Laboratorio di Architettura degli Elaboratori

Architettura del processore. Modello di calcolatore. Caratteristiche del processore. Caratteristiche del processore. Fondamenti di Informatica

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

SET/CLEAR LOAD DATA FROM STRING

INFORMATICA GENERALE E BASI DI DATI PER ARCHIVI AUDIOVISIVI (PRIMO MODULO) Claudio Piciarelli A.A. 2013/2014

Capitolo 11 Elaborazione di file

ASSEMBLY MIPS GUIDA RAPIDA ALLA COMPRENSIONE

Come funzionano i computer

L'allocazione dinamica della memoria

Accesso a memoria. Accesso a memoria. Accesso a memoria. Modalità di indirizzamento. Lezione 5 e 6. Architettura degli Elaboratori A.

Allocazione dinamica della memoria

Materiale didattico. Materiale didattico. Architettura MIPS. Il linguaggio Assembly parte I. Architettura degli Elaboratori e delle Reti

Laboratorio 1. 2) All interno della directory c:\temp\cognome\codici creare il file sorgente hello.c contenente il seguente codice:

ARCHITETTURA DELLE CPU come ARCHITETTURA DEL SET DI ISTRUZIONI

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Puntatori in C Lucidi della Pof.ssa Pazienza

Linguaggio C I puntatori

Programmazione Assembly per 8088: Esercizi svolti

Transcript:

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

SPIM / XSPIM Comandi principali: load read FILE carica un programma in memoria run lancia il programma caricato step <N> esegue N istruzioni di programma clear reset registri o memoria set value inserisce valori in registri o memoria print stampa valore di registri o memoria breakpoint, delete inserisce/toglie breakpoints help quit exit L 13 3/30 SPIM / XSPIM comandi Da help di SPIM:! reinitialize -- Clear the memory and registers! load / read FILE -- Read FILE of assembly code into memory! run <ADDR> -- Start the program at optional ADDRESS! step <N> -- Step the program for N instructions! continue -- continue program execution without stepping! print -- print value of a register or a memory location " print $N $fn -- Print register N floating point register N " print ADDR -- Print contents of memory at ADDRESS " print_symbols -- Print all global symbols " print_all_regs -- Print all MIPS registers " print_all_regs hex -- Print all MIPS registers in hex! breakpoint <ADDR> -- Set a breakpoint at address! delete <ADDR> -- Delete all breakpoints at address! list -- List all breakpoints! exit,quit -- Exit the simulator Abbreviazioni: basta il prefisso unico. ex(it), re(ad), l(oad), ru(n), s(tep), p(rint) L 13 4/30

Sommario! Direttive! Chiamate di sistema (system call)! Esempi L 13 5/30 Direttive! Definizione: le direttive danno delle indicazioni all assemblatore: " su come memorizzare il programma e i dati in memoria " su come eseguire il programma Assembly! Sintassi: le direttive iniziano con il carattere.! Classificazione: " direttive relative al segmento dati " direttive relative al segmento testo! Struttura programma Assembly: 1. segmento dati: " contiene le dichiarazioni di variabili e costanti " inizia con la direttiva:.data 2. segmento testo: " contiene il programma " inizia con la direttiva:.text.data {direttive segmento dati}.text {direttive segmento testo} {istruzioni Assembly} programma Assembly L 13 6/30

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 bytes 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 bytes nel segmento dati L 13 7/30 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 13 8/30

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 13 9/30 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 13 10/30

Sommario! Direttive! Chiamate di sistema (system call)! Esempi L 13 11/30 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 13 12/30

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 (IEEE 754) che le viene passato come argomento; 3: print_double: " stampa sulla console il numero in virgola mobile con doppia precisione (IEEE 754) 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 13 13/30 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) e la interpreta come numero intero (32 bit); 6: read_float: " leggono una linea in ingresso fino al carattere a capo incluso (i caratteri che seguono il numero sono ignorati) e la interpreta come numero in virgola mobile!singola precisione (32 bit); 7: read_double: " leggono una linea in ingresso fino al carattere a capo incluso (i caratteri che seguono il numero sono ignorati) e la interpreta come numero in virgola mobile!doppia precisione (64 bit); 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 13 14/30

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 13 15/30 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 13 16/30

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 13 17/30 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 13 18/30

Sommario! Direttive! Chiamate di sistema (system call)! Esempi L 13 19/30 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 13 20/30

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 13 21/30 Esempio! Calcolo somma dei quadrati da 1 a n:! Codice C: int main(int argc, char* argv[]) { int i, n = 10, t = 0; for (i=1;i<=n;i++) t += i*i; printf( La somma vale %d\n, t ); return(0); } L 13 22/30

Esempio: codice Assembly # Programma che somma i quadrati dei primi N numeri # N e' memorizzato in t1.data str:.asciiz "La somma vale ".text.globl main main: li $t1, 10 # N interi di cui calcolare la somma quadrati li $t6, 1 # t6 e' indice di ciclo indice di ciclo li $t8, 0 # t8 contiene la somma dei quadrati Loop: mult $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 13 23/30 Esempio 2: estrazione da array # Programma che copia tramite una procedura # gli interi positivi contenuti nell array (elem) # in un secondo array (pos_el)! Algoritmo: 1. Inizializzazione 2. Leggi gli interi 3. Individua gli interi positivi 4. Copia gli interi positivi 5. Stampa gli interi positivi L 13 24/30

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 13 25/30 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 add $t0, $s0, $zero # 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 13 26/30

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. add $a0, $s0, $zero # $a0! ind. array elem. add $a1, $s1, $zero # $a1! ind. array pos_el add $a2, $s2, $zero # $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 13 27/30 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 add $t0, $s1, $zero # $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 13 28/30

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) add $s0, $a0, $zero add $s1, $a0, $a2 add $s2, $a1, $zero # allocazione dello stack # $s0! ind. ciclo su elem # $s1! ind. fine ciclo su elem # $s2! ind. ciclo su pos_el L 13 29/30 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 13 30/30