MIPS Instruction Set 2



Похожие документы
Aritmetica dei Calcolatori 2

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

Il simulatore SPIM SPIM

Calcolatori Elettronici A a.a. 2008/2009

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

Istruzioni di trasferimento dati

MIPS Instruction Set 1

Allocazione dinamica della memoria - riepilogo

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

Istruzioni di controllo del flusso

Architettura (10/9/2003) Pag. 1/6. Cognome e Nome (in stampatello):

Funzioni in C. Violetta Lonati

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

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Calcolatori Elettronici

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

Le variabili. Olga Scotti

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Laboratorio di Architettura degli Elaboratori

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Linguaggio Assembler MIPS

Lezione 1: L architettura LC-3 Laboratorio di Elementi di Architettura e Sistemi Operativi 10 Marzo 2014

Concetto di Funzione e Procedura METODI in Java

Calcolatori Elettronici

4 PASSI PER INVIARE LA TUA NEWSLETTER CON MAILUP

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

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

7.4 Estrazione di materiale dal web

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

MODELLI DI MEMORIA e CALL

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

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

L ambiente di simulazione SPIM

CALCOLATORI ELETTRONICI 29 giugno 2010

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 funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Funzioni. Il modello console. Interfaccia in modalità console

puntatori Lab. Calc. AA 2007/08 1

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

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

Esempio di moltiplicazione come somma e spostamento

Struttura di un programma Java

Lezione 16: L architettura LC-3

Gestione dei File in C

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

INFORMATICA 1 L. Mezzalira

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Calcolatori Elettronici Parte X: l'assemblatore as88

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

Matlab: Funzioni. Informatica B. Daniele Loiacono

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Definire gli attributi dei blocchi

costruttori e distruttori

Introduzione al Linguaggio C

Entrare nel sistema. Clicca su Entra per entrare nel sistema. PAGINA 1

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

Salvare e importare dati

La selezione binaria

Le costanti Le modalità di indirizzamento L assembly del MIPS

Esercitazione 7. Procedure e Funzioni

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Introduzione al MATLAB c Parte 2

ARCHITETTURA DEGLI ELABORATORI II - LABORATORIO

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Транскрипт:

Laboratorio di Architettura 15 aprile 2011

1 Architettura Mips 2 Chiamata a Funzione 3 Esercitazione

Registri MIPS reference card: http://refcards.com/docs/waetzigj/mips/mipsref.pdf 32 registri general purpose a 32bit: Numero Nome Uso Preservati dal chiamato? $0 $zero constante 0 N/A $1 $at temp assembler No $2-$3 $v0-$v1 retval funzioni e expr eval No $4-$7 $a0-$a3 args funzione No $8-$15 $t0-$t7 temp No $16-$23 $s0-$s7 temp da salvare Si $24-$25 $t8-$t9 temp No $26-$27 $k0-$k1 riservati kernel No $28 $gp global pointer Si $29 $sp stack pointer Si $30 $fp frame pointer Si $31 $ra return address N/A

Chiamata a Funzione Dato un semplice programma C che esegue una chiamata a funzione, traduciamolo in assembly e simuliamone il funzionamento. / v a r i a b i l i g l o b a l i / i n t res ; i n t double ( i n t a ) { return ( a + a ) ; } void main ( void ) { res = double ( 100 ) ; }

Regole per la Chiamata a Funzione La chiamata si esegue con l istruzione jal <label>, che imposta anche l indirizzo di ritorno Si possono specificare fino a 4 parametri tramite i registri $4-$7 Ulteriori parametri si specificano utilizzando lo stack La funzione inizia con:.ent <nome_funzione> <nome_funzione>: e termina con:.end <nome_funzione> Il valore di ritorno deve trovarsi nel registro $2 (e $3 se necessario) Per il ritorno dalla funzione si esegue jr $31

Regole Registri Nell utilizzo di chiamate a funzione e importante attenersi alle regole di utilizzo dei registri: $2-$3 modificabili per metterci i valori di ritorno dalla funzione $4-$7 modificabili, contengono i parametri di chiamata alla funzione $8-$15 modificabili, sono i temporanei $16-$23 modificabili solo dopo averli salvati sullo stack $24-$25 modificabili, sono i temporanei $28-$31 modificabili solo dopo averli salvati sullo stack

Traduzione Assembly main: MAIN.globl main li $4, 100 # carico il parametro per la funzione jal double # setto il ret addr e salto alla funzione sw $2, res # scrivo in memoria il risultato jr $31 # ritorno al chiamante.end main DOUBLE.ent double double: add $2,$4,$4 # raddoppio il parametro della funzione jr $31 # ritorno al chiamante.end double Notate qualche problema? L istruzione jal del main setta il ret addr per continuare con la sw successiva al ritorno da double, perdendo cosi il ret addr del chiamante del main.

Lo Stack 1/3 Il problema descritto precedentemente si risolve salvando il ret addr del chiamante di main sullo stack. Lo stack cresce dagli indirizzi alti verso quelli bassi quindi per allocare spazio per una variabile devo decrementare lo stack pointer. Prima di eseguire la chiamata a funzione (jal) salvo il valore di $31 sullo stack addi $sp,$sp,-4 # Alloco spazio per un int nello stack sw $31,0($sp) # Salvo ret addr sullo stack

Lo Stack 2/3 Le regole sui registri fissano $4-$7 per il passaggio di parametri ad una funzione, se devo passare alla funzione piu di 4 parametri utilizzo lo stack per contenere i parametri eccedenti addi $sp,$sp,-8 # Alloco spazio per due int nello stack sw $9,0($sp) # Salvo parametro 6 sullo stack sw $8,4($sp) # Salvo parametro 5 sullo stack

Lo Stack 3/3 Recupero i parametri che mi occorrono dallo stack lw $8,4($sp) # Recupero parametro 5 dallo stack lw $9,0($sp) # Recupero parametro 6 dallo stack addi $sp,$sp,8 # Rimuovo lo spazio per due int dallo stack Dopo la chiamata a funzione devo ripristinare il registro $31 recuperandolo dallo stack lw $31,0($sp) # Recupero ret addr dallo stack addi $sp,$sp,4 # Rimuovo lo spazio per un int dallo stack Qualunque funzione che ne richiami altre al suo interno e tenuta a salvare sullo stack il ret addr e tutti i registri che vuole preservare.

Traduzione Assembly con Stack MAIN.globl main main: addi $sp,$sp,-4 # Alloco spazio per un int nello stack sw $31,0($sp) # Salvo ret addr sullo stack li $4, 100 # carico il parametro per la funzione jal double # setto il ret addr e salto alla funzione sw $2, res # scrivo in memoria il risultato lw $31,0($sp) # Recupero ret addr dallo stack addi $sp,$sp,4 # Rimuovo lo spazio per un int dallo stack jr $31 # ritorno al chiamante.end main DOUBLE.ent double double: add $2,$4,$4 # raddoppio il parametro della funzione jr $31 # ritorno al chiamante.end double

Codice Completo.text.align 2.ent double double: add $2,$4,$4 # raddoppio il parametro della funzione jr $31 # ritorno al chiamante.end double.globl main main: addi $sp,$sp,-4 # Alloco spazio per un int nello stack sw $31,0($sp) # Salvo ret addr sullo stack li $4, 100 # carico il parametro per la funzione jal double # setto il ret addr e salto alla funzione sw $2, res # scrivo in memoria il risultato lw $31,0($sp) # Recupero ret addr dallo stack addi $sp,$sp,4 # Rimuovo lo spazio per un int dallo stack jr $31 # ritorno al chiamante.end main.data 0x10002000.align 2 res:.space 4

Esercitazione 1/2 # define NUM 4 i n t A [NUM], somma; / / Funzione d i somma i n t sum( i n t a, i n t b ) { return ( a + b ) ; } / / Funzione d i somma r i c o r s i v a i n t sum_rec ( i n t data, i n t size ) { i f ( size == 0 ) { return 0; } else { return sum_rec ( data, size 1) + data [ size 1 ] ; } }

Esercitazione 2/2 i n t main ( void ) { r e g i s t e r i n t i, j ; / / I n i z i a l i z z a array A j = 2; for ( i = 0; i < NUM; i ++ ) { A [ i ] = sum( i, j ) ; j ++; } / / Somma g l i elementi d i A somma = sum_rec ( A, NUM ) ; } / / Ritorna l a somma return somma;

Scheletro di file assembly.text.align 2.ent < nome_funz > < nome_funz > < codice funzione >.end < nome_funz > main:.globl main < codice main >.end main.data.align 2 # PROLOGO # FUNZIONI # MAIN # DATI < variabili >

Requisiti Fondamentali 1 Una volta scritto l assembler MIPS corrispondente alle funzioni e al main lo si commenti riga per riga in modo tale che sia chiaro il funzionamento generale del programma. 2 Gli elementi dell array A e somma vanno mantenuti in memoria, quindi se il loro valore viene modificato anche la memoria deve essere aggiornata. 3 Durante la simulazione con SPIM si catturi in un file di testo il valore dello stack alla fine di ogni chiamata alla funzione sum_rec() giustificando i valori contenuti nei registri e nella memoria. 4 Al termine della simulazione con SPIM, si catturi in un file di testo il valore di tutti i registri (finestra in alto di SPIM, tralasciare i registri floating point) della memoria e dello stack (finestra data segment ) giustificando i valori contenuti nei registri e nella memoria.

Consegna La relazione da consegnare e formata da: 1 un file di testo.s contenente la traduzione in assembler MIPS del programma C 2 un file di testo con la copia degli output del simulatore SPIM NON usate la cattura di immagini da schermo: copiate ed incollate usando un editor di testo NON includete file BINARI o creati con WORD, EXCEL... NON verranno considerate mail con piu di 3 file allegati! Spedite tutto a arc1@fe.infn.it entro le ore 23:59:59 di domenica 24 aprile. L oggetto della mail deve essere nella forma: LAB1-N#esercitazione-#gruppo ( es: LAB1-N4-99)