Calcolatori Elettronici A a.a. 2008/2009



Documenti analoghi
Il simulatore SPIM SPIM

L ambiente di simulazione SPIM

Linguaggio Assembler MIPS

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

MIPS Instruction Set 2

Le costanti Le modalità di indirizzamento L assembly del MIPS

Linguaggio Assembler MIPS

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

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

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

Calcolatori Elettronici

L ambiente di simulazione SPIM

[

Procedure: esempi. Esempi: ricorsione fattoriale Fibonacci ordinamenti

Laboratorio di Architettura degli Elaboratori LabArch 2006 Secondo Quadimestre, a.a Docente: H. Muccini

Funzioni. Il modello console. Interfaccia in modalità console

Gestione dei File in C

Stringhe di caratteri

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Caratteri e stringhe Esercizi risolti

Architettura di tipo registro-registro (load/store)

CALCOLATORI ELETTRONICI 29 giugno 2010

Assembly III SPIM: un ambiente di simulazione MIPS

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

Calcolatori Elettronici

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

Il linguaggio assembly

Architetture dei Calcolatori

Arduino: Programmazione

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

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:

CALCOLATORI ELETTRONICI 29 giugno 2011

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

Istruzioni di trasferimento dati

ARCHITETTURA DEGLI ELABORATORI II - LABORATORIO

Funzioni in C. Violetta Lonati

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Istruzioni di controllo del flusso

Fetch Decode Execute Program Counter controllare esegue prossima

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

La selezione binaria

Laboratorio di Architettura degli Elaboratori

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

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

Programmi in Assembly

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Introduzione a Dev-C++

Calcolatori Elettronici Parte X: l'assemblatore as88

puntatori Lab. Calc. AA 2007/08 1

Esercizi di programmazione in C

Modalità di indirizzamento

Sottosistema di Ingresso/Uscita (I/O)

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

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

Introduzione alla programmazione in C

Le stringhe. Le stringhe

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

Alcune regole di base per scrivere un programma in linguaggio C

Calcolatori Elettronici A a.a. 2008/2009

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

Introduzione al Linguaggio C

Calcolatori Elettronici A a.a. 2008/2009

Calcolatori Elettronici. La Pipeline Criticità sui dati Criticità sul controllo Cenni sull unità di controllo

Appunti per il corso di Laboratorio di informatica: Architetture

L architettura del calcolatore (Prima parte)

Compilare il primo programma. Primo programma in C. Esercizio Somma due numeri. Compilare il primo programma. Analisi. Analisi

Codifica: dal diagramma a blocchi al linguaggio C++

Assembly V: Procedure annidate e recursive

Architettura della CPU e linguaggio assembly Corso di Abilità Informatiche Laurea in Fisica. prof. ing. Corrado Santoro

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

Lezione laboratorio SPIM

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

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

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

Dal sorgente all eseguibile I programmi Assembly

CALCOLATORI ELETTRONICI 15 aprile 2014

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

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

Tutorial sugli ambienti di sviluppo: Eclipse e NetBeans

p = 7. E = bias + p = = E = s e m

ARCHITETTURE DEI CALCOLATORI (canale A-I) - Prima prova in itinere del 16/6/2003 Compito tipo A

La struttura dati ad albero binario

Linguaggio C. Fondamenti. Struttura di un programma.

Algebra Booleana ed Espressioni Booleane

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

CALCOLATORI ELETTRONICI 31 marzo 2015

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Java: Compilatore e Interprete

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

10 - Programmare con gli Array

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

Informatica B. Breve introduzione all ambiente di programmazione. Politecnico di Milano IV Facoltà di Ingegneria 2003

Dal sorgente all eseguibile I programmi Assembly

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

Breve riepilogo della puntata precedente:

Transcript:

Calcolatori Elettronici A a.a. 2008/2009 ISA e LINGUAGGIO ASSEMBLY MIPS ESERCIZI Massimiliano Giacomin

ESERCIZIO Utilizzando la green card, tradurre in linguaggio macchina le due istruzioni in assembly MIPS seguenti L1: addi $t0, $t1, 1 bne $t0, $s1, L1 2

ESERCIZIO Utilizzando la green card, tradurre in linguaggio macchina le due istruzioni in assembly MIPS seguenti L1: addi $t0, $t1, 1 bne $t0, $s1, L1 addi: formato-i, R[rt] = R[rs] + SignExtImm, codice op: 8 hex 001000 01001 01000 0000000000000001 8 9 8 1 3

ESERCIZIO Utilizzando la green card, tradurre in linguaggio macchina le due istruzioni in assembly MIPS seguenti L1: addi $t0, $t1, 1 bne $t0, $s1, L1 addi: formato-i, R[rt] = R[rs] + SignExtImm, codice op: 8 hex 001000 01001 01000 0000000000000001 8 9 8 1 bne: formato-i, if(r[rs]!=r[rt]) PC=PC+4+BranchAddr, c. op: 5 hex Branch Address: -2 (in istruzioni) 000101 01000 10001 1111111111111110 5 8 17-2 4

ESERCIZIO Utilizzando la green card, ricavare dal formato numerico seguente la corrispondente istruzione assembly MIPS AE090000 5

AE090000: 1010 1110 0000 1001 0000 0000 0000 0000 Green card-retro sw, che ha formato-i 6

AE090000: 1010 1110 0000 1001 0000 0000 0000 0000 Green card-retro sw, che ha formato-i Opcode 10000 01001 0..0 rs= r16 = $s0 rt= r9 = $t1 7

AE090000: 1010 1110 0000 1001 0000 0000 0000 0000 Green card-retro sw, che ha formato-i Opcode 10000 01001 0..0 sw $t1, 0($s0) rs= r16 = $s0 rt= r9 = $t1 8

ESERCIZIO (condizione AND) Frammento di codice C: if ((i == j) && (k == m)) f = g + h; Supponendo che f, g, h, i, j, k, m corrispondano ai registri: $s0, $s1, $s2, $s3, $s4, $s5, $s6 diventa: 9

ESERCIZIO (condizione AND) Frammento di codice C: if ((i == j) && (k == m)) f = g + h; Supponendo che f, g, h, i, j, k, m corrispondano ai registri: $s0, $s1, $s2, $s3, $s4, $s5, $s6 diventa: bne $s3, $s4, ESCI bne $s5, $s6, ESCI add $s0, $s1, $s2 ESCI: 10

ESERCIZIO (condizione OR) Frammento di codice C: if ((i == j) (k == m)) f = g + h; Supponendo che f, g, h, i, j, k, m corrispondano ai registri: $s0, $s1, $s2, $s3, $s4, $s5, $s6 diventa: 11

ESERCIZIO (condizione OR) Frammento di codice C: if ((i == j) (k == m)) f = g + h; Supponendo che f, g, h, i, j, k, m corrispondano ai registri: $s0, $s1, $s2, $s3, $s4, $s5, $s6 diventa: beq $s3, $s4, L1 bne $s5, $s6, ESCI L1: add $s0, $s1, $s2 ESCI: 12

ESERCIZIO Tradurre in assembly MIPS la seguente procedura C, che copia la stringa y nella stringa x void strcpy (char x[], char y[]){ } int i; i = 0; while ((x[i]=y[i])!='\0') i += 1; Supponendo che: gli indirizzi di x e y siano passati in ingresso per la variabile locali i venga usato $s0 13

<Predisponi lo stack e salva registri come chiamato> add $s0, $zero, $zero # i = 0 # while((x[i]=y[i])!='\0') L1: add $t1, $s0, $a1 # addr of y[i] in $t1 lbu $t2, 0($t1) # $t2 = y[i] add $t3, $s0, $a0 # addr of x[i] in $t3 sb $t2, 0($t3) # x[i] = y[i] beq $t2, $zero, L2 # exit loop if y[i] == 0 addi $s0, $s0, 1 # i = i + 1 j L1 # next iteration of loop L2: <Rispristina registri salvati, svuota lo stack e ritorna> NB: la procedura usa s0 (per la variabile locale) e non ne chiama un altra: deve solo salvare s0! 14

strcpy: addi $sp, $sp, -4 # adjust stack for 1 item sw $s0, 0($sp) # save $s0 add $s0, $zero, $zero # i = 0 L1: add $t1, $s0, $a1 # addr of y[i] in $t1 lbu $t2, 0($t1) # $t2 = y[i] add $t3, $s0, $a0 # addr of x[i] in $t3 sb $t2, 0($t3) # x[i] = y[i] beq $t2, $zero, L2 # exit loop if y[i] == 0 addi $s0, $s0, 1 # i = i + 1 j L1 # next iteration of loop L2: lw $s0, 0($sp) # restore saved $s0 addi $sp, $sp, 4 # pop 1 item from stack jr $ra # and return 15

ESERCIZIO Tradurre in assembly MIPS la seguente procedura C, che converte i caratteri della stringa x in maiuscolo se m=1, in minuscolo se m=0. Si ipotizzi di disporre delle procedure tolower e toupper void strconv (char x[], int m){ } int i = 0; while (x[i]!= '\0'){ if(m==1) x[i]=toupper[x[i]]; else x[i]=tolower[x[i]]; i++;} 16

NB: l indirizzo della stringa x e il parametro m sono in $a0 e $a1 Prima versione del corpo della procedura add $s0, $zero, $zero # i = 0 # while(x[i]!='\0') loop: add $t1, $s0, $a0 # addr of x[i] in $t1 lbu $t2, 0($t1) # $t2 = x[i] beq $t2, $zero, exit # exit loop if x[i] == 0 move $a0, $t2 # ERRORE: cancelliamo a0!!! beq $a1, zero, tolow jal toupper # if(m==1) j skip tolow: jal tolower skip: sb $v0, 0($t1) addi $s0, $s0, 1 j loop # else # x[i]= # i++ # next iteration of loop exit: 17

Devono essere preservati: possiamo usare registri s Possiamo direttamente usare $t1 incrementandolo add $s0, $zero, $zero # i = 0 # while(x[i]!='\0') loop: add $t1, $s0, $a0 # addr of x[i] in $t1 lbu $t2, 0($t1) # $t2 = x[i] beq $t2, $zero, exit # exit loop if x[i] == 0 move $a0, $t2 # ERRORE: cancelliamo a0!!! beq $a1, zero, tolow jal toupper # if(m==1) j skip tolow: jal tolower skip: sb $v0, 0($t1) addi $s0, $s0, 1 j loop # else # x[i]= # i++ # next iteration of loop exit: 18

move $s0, $a0 # addr of x[] in $s0 move $s1, $a1 loop: lbu $t0, 0($s0) # $t0 = x[i] beq $t0, $zero, exit # exit loop if x[i] == 0 move $a0, $t0 # per la procedura toxxx beq $s1, zero, tolow jal toupper # if(m==1) j skip tolow: jal tolower skip: sb $v0, 0($s0) addi $s0, $s0, 1 j loop # else # x[i]= # i++ # next iteration of loop exit: E chiaro che ora però dobbiamo salvare s0 e s1 come chiamato, oltre a ra: servirà spazio sullo stack per 3 elementi 19

strconv: addi $sp, $sp, -12 # spazio stack per 3 # elementi sw $ra, 0($sp) #salvo ra, so, s1 sw $s0, 4($sp) sw $s1, 8($sp) [corpo della procedura, come da lucido prec.] lw $ra, 0($sp) #riprist. ra, so, s1 lw $s0, 4($sp) lw $s1, 8($sp) addi $sp, $sp, 12 jr $ra # svuoto stack 20

INTRODUZIONE A SPIM SPIM (MIPS letto al contrario) è un interprete di programmi scritti per i processori MIPS R2000/R3000 Include un debugger e fornisce dei servizi simili a quelli di un semplice sistema operativo Si trova nel CD del libro di testo. Documentazione nello stesso CD ed anche nell appendice A Si presenta con 4 finestre: - registri - text - data - messaggi (es. nel caso di errori di sintassi) 21

Funzionalità di base I programmi vanno scritti come file di testo con estensione.s o.asm e possono essere caricati con File/Open Esecuzione di un programma: con Go (o F5) oppure passo-passo con Single step o Multiple step In esecuzione del programma, la lettura/scrittura di dati avviene via terminale attraverso la finestra Console La finestra registri permette di visualizzare come cambiano i valori Set value permette di caricare dei valori nei registri o in indirizzi di memoria Dato che il programma è chiamato come una procedura, deve contenere l etichetta main e dovrebbe terminare con un istruzione di ritorno jr $ra 22

La finestra di testo Ciascuna istruzione è visualizzata su una linea del tipo [0x00400024] 0x02288820 add $17, $17, $8 ; 3: add $s1, $s1, $t0 Il primo numero, che compare fra parentesi quadre, è l indirizzo esadecimale dell istruzione Il secondo numero è la codifica esadecimale dell istruzione Il terzo elemento è la descrizione mnemonica dell istruzione Ciò che segue dopo il punto e virgola è l effettiva linea di codice del programma utente che ha generato l istruzione; il numero 3 è la linea del file in cui si trova l istruzione Se non compare la parte dopo il punto e virgola significa che l istruzione è stata generata da SPIM come parte della traduzione di una pseudoistruzione 23

La finestra della memoria dati Indirizzi delle parole [0x10000000] [0x10000004] [0x10000008] [0x1000000c] [0x10000000] 0x00000004 0x0000000a 0x00000014 0x00000064 Indirizzo di un blocco di 4 parole Parola di 4 byte (in esadecimale) Ciò che viene visualizzato in SPIM Indirizzi dei singoli byte 00000000 00000000 00000000 00001010 [0x10000007] [0x10000006] [0x10000005] [0x10000004] I singoli byte (in binario) 24

Input\output con SPIM Un programma eseguito con SPIM può leggere i caratteri inseriti dall utente e visualizzare eventuali uscite sulla finestra di console In pratica, si usano chiamate di sistema (syscall) per scrivere su (o leggere da) console Il programma deve caricare il codice della chiamata di sistema nel registro $v0 e gli argomenti nei registri $a0- $a3 Le chiamate di sistema che forniscono un valore in uscita mettono il risultato in $v0 (o in $f0) Se si usano le chiamate di sistema occorre disabilitare l opzione mapped I/O 25

Servizi di sistema e codici corrispondenti Servizio Codice della chiamata Argomenti Risultato di sistema print_int 1 $a0 = intero print_float 2 $f12 = virgola mobile print_double 3 $f12 = doppia precisione print_string 4 $a0 = stringa read_int 5 intero (in $v0) read_float 6 virgola mobile (in $f0) read_double 7 doppia precisione (in $f0) read_string 8 $a0=buffer, $a1=lunghezza sbrk 9 $a0=quantità indirizzo (in $v0) exit 10 26

Esempio: codice per una stampa semplice Il seguente codice stampa risposta = 5 main:.data str:.asciiz "risposta = ".text li $v0, 4 # codice della chiamata di sistema per # print_string la $a0, str # carica in $a0 l indirizzo della stringa da # stampare syscall # stampa della stringa li $v0, 1 # codice della chiamata di sistema per # print_int li $a0, 5 # carica in $a0 numero intero da stampare syscall # stampa del numero risultato 27

Esempio: programma con lettura da tastiera Programma che legge da console dei numeri interi e li somma finchè in ingresso non viene immesso 0 Il corpo principale del programma è il ciclo seguente: ciclo: li $v0, 5 # codice della chiamata di sistema per # read_int syscall # leggi numero da tastiera in $v0 beq $v0, $zero, fine # se $v0 vale 0 vai a fine add $t1, $t1, $v0 # somma nel registro $t1 j ciclo # torna ad acquisire nuovo dato I numeri vengono inseriti uno alla volta dando invio dopo ciascuno 28

Programma completo main:.text move $t1, $zero # inizializza sommatore ciclo: li $v0, 5 # codice della chiamata di sistema per read_int syscall # leggi numero da tastiera in $v0 beq $v0, $zero, fine # se $v0 vale 0 vai a fine add $t1, $t1, $v0 # somma nel registro $t1 j ciclo # torna ad acquisire nuovo dato fine: li $v0, 4 # codice della chiamata di sistema per print_string la $a0, str # indirizzo della stringa da stampare syscall # stampa della stringa li $v0, 1 # codice della chiamata di sistema per print_int move $a0, $t1 # numero intero da stampare syscall # stampa del numero risultato.data str:.asciiz ECCO IL RISULTATO: " 29

Esercizi Proposti Traduzione di istruzioni assembly in linguaggio macchina e viceversa. Verifica con SPIM (attenzione: sbaglia la traduzione della costante nei salti condizionati) Tradurre in linguaggio assembly la seguente procedura, che stampa la somma dei quadrati da 1 ad un argomento passato in ingresso. void sommaquad (int n){ } int somma=0; for(i=1; i<=n; i++) somma += i*i; printf( La somma vale %d\n, somma); 30

Tradurre in linguaggio assembly la seguente procedura, che calcola il numero di Fibonacci di posizione n [si ricorda che F(0)=0, F(1)=1 e per k>1 F(k)=F(k-1)+F(k-2) ] int Fibonacci (int n){ } if(n==0) return 0; else if(n==1) return 1; else return Fibonacci(n-1)+Fibonacci(n-2); 31