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

Slides:



Advertisements
Presentazioni simili
Puntatori in C e C++.
Advertisements

Procedure In assembler.
LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
Generazione di Codice Intermedio
Algoritmi e Programmazione
Massa Laura Mela Enrica
Gestione della Memoria
Chiamate a Procedure. Per lesecuzione di una procedura, un programma deve eseguire i seguenti sei passi: mettere i parametri in un posto dove la procedura.
SPIM Esercizi. Esercizio 7 – load/store Il codice deve: Inserire in memoria la word 0x a Leggere questo dato e inserirlo in s0 Sommarci 5 Salvare.
Architetture dei Calcolatori (Lettere j-z) Il Processore (2)
Laboratorio di informatica: ASSEMBLER
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 18 Aprile 2012.
File.
eliana minicozzi linguaggi1a.a lezione2
CALCOLATORI ELETTRONICI Gestione delle subroutine.
Caratteristiche principali dell’architettura del processore MIPS
Caratteristiche principali dell’architettura del processore MIPS
Gestione delle subroutine
Corso di Informatica Applicata - Lezione 3 - © 2005 Saverio De Vito Corso di Informatica Applicata Lezione 3 Università degli studi di Cassino Corso di.
Il Linguaggio Macchina
GENERAZIONE CODICE MACCHINA
Codifica di algoritmi linguaggio macchina vs programmazione strutturata Lab Programmazione - turno /2006.
Approfondimento delle classi
memoria gestita staticamente:
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
Le funzioni a tempo di esecuzione
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
CALCOLATORI ELETTRONICI II
Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli
Introduzione al linguaggio assembly del microprocessore a parte
Introduzione al linguaggio assemby del microprocessore a parte
I vettore interruzioni
Architettura del calcolatore
Architettura degli Elaboratori II (canale P-Z) Istruzioni di controllo Dott. Franco Liberati.
Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un sottoprogramma (subroutine) a sé stante, richiamabile dal.
INTERFACCIAMENTO ASSEMBLY - C++
Unità Didattica 3 Linguaggio C
Introduzione al linguaggio assembly del microprocessore a parte
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Architettura degli Elaboratori II (canale P-Z) Modi di Indirizzamento Dott. Franco Liberati.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Complessità di un algoritmo
1 Università di Pavia - corso di Calcolatori Elettronici C code: L1:g = g + A[i]; i = i + j; if (i != h) goto L1; MIPS code: L1:add $t1, $s3, $s3# $t1.
1 Università di Pavia - corso di Calcolatori Elettronici PROGETTO DI UN SISTEMA BASATO SU  P PROBLEMA REALE SVILUPPO HARDWARESVILUPPO SOFTWARE INTEGRAZIONE.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Arch. Elab. - S. Orlando 1 Esercitazione su Instruction Level Parallelism Salvatore Orlando.
Architettura di una CPU
Calcolatori Elettronici Assemblatore, Linker e Loader
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Allievi Elettrici - AA Le funzioni ricorsive in C
Programmazione Assembly
Corso di Laurea in Informatica Architettura degli elaboratori a.a La macchina programmata Instruction Set Architecture (2) Istruzioni I-type Indirizzamento.
Architettura di un calcolatore e linguaggio macchina.
L’esecuzione dei programmi
SPIM Esercizi. Esercizio 1 – il comando ‘li’ Il codice deve eseguire una singola operazione: mettere il valore immediato 1023 nel registro s3.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
FUNZIONI: IL MODELLO A RUN-TIME 1) creazione di una nuova attivazione (istanza) del servitore 2) allocazione di memoria per i parametri e per le variabili.
Esercitazione 4 Chiamate di procedure Claudia Raibulet
Esercizi.
Convenzioni chiamate a procedure Riassunto Pratico.
1 System Call ancora Vediamo passo passo come funziona una SC.
Corso di Laurea in Informatica Architettura degli elaboratori a.a Programmazione Assembly: procedure (1) Supporto hardware alle procedure Passaggio.
Corso di Laurea in Informatica Architettura degli elaboratori a.a La macchina programmata (3) Istruzioni J-type Istruzioni di salto Istruzioni.
Corso di Laurea in Informatica Architettura degli elaboratori a.a Programmazione Assembly: procedure (2) Convenzioni di uso dei registri Utilizzo.
Corso di Laurea in Informatica Architettura degli elaboratori a.a ISA e Asm: esempi e suggerimenti.
Transcript della presentazione:

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

2 Indice degli argomenti Programmazione assembly Definizione e controllo di sottoprogrammi Definizione di funzione Chiamate a funzioni Convenzioni riguardanti luso dei registri Funzioni ricorsive Lo Stack

3 Funzioni Una funzione (o routine) è una sequenza di istruzioni che esegue un compito definito e che viene usata come se fosse una unità di codice. Una funzione è una astrazione presente in (quasi) tutti i linguaggi ad alto livello. Assegna un nome ad una operazione complessa (fatta da più istruzioni) Maggiore leggibilità del codice. Riutilizzazione del codice Lintero programma assembly viene visto come un insieme di funzioni Non è una supportata dallassembly; questultimo fornisce solo le istruzioni e i registri che consentono di realizzare delle funzioni. È un insieme di convenzioni.

4 Chiamata a funzione e ritorno Chiamata a funzione: Per chiamare una funzione si usa listruzione jal function-name (jal = jump and link) Memorizza lindirizzo dellistruzione che segue il jal nel registro $ra e salta alletichetta function-name Ritorno da funzione: Per tornare da una funzione si usa listruzione jr $ra (jr = jump register) Salta allindirizzo contenuto nel registro $ra Alloccorrenza si può anche usare un altro registro

5 … 0x jal funzione1 0x … funzione1 jr $ra … Chiamata a funzione e ritorno -ESECUZIONE - funzione1 1. Vengono eseguite le istruzioni della funzione chiamante f che precedono la chiamata (jal) a funzione1 2. Chiamata: listruzione jal salva lindirizzo della prossima istruzione (da eseguire al ritorno) in $ra e salta allinizio della funzione chiamata 3. Vengono eseguite tutte le istruzioni di funzione1 fino alla jr conclusiva 4. Ritorno: listruzione jr salta alla prima istruzione che segue la chiamata 5. Vengono eseguite le rimanenti istruzioni della funzione chiamante

6 Esempio Funzione main:la $a0,str Argomenti in $a0-$a3 Funzione jal length Chiamata a funzione Chiamante sw $v0,result Risultati in $v0-$v1 length:move $t0,$a0 Parametro: $a0 li $t1,0 Funzione nextChar:lbu $t2,($t0) Chiamata beqz $t2,end addu $t0,$t0,1 addu $t1,$t1,1 b nextChar end:move $v0,$t1 Valore di ritorno: $v0 jr $ra

7 Funzione Una funzione può essere: Foglia: Se non chiama altre funzioni al suo interno Non-foglia: Se è sia chiamante che chiamata main:lw $a0,xadder: lw $a1,yadd $v0,$a0,$a1 jal adderjr $ra sw $v0,z FUNZIONE NON FOGLIA FUNZIONE FOGLIA

8 Chiamata a funzione e ritorno -PROBLEMI GENERALI - 1. Il registro $ra non è sufficiente se la funzione chiamata è a sua volta un chiamante (non foglia) 2. Desidero passare vari parametri alla funzione chiamata e ottenere un risultato 3. Mi fa comodo definire una convenzione per stabilire quali registri vengono preservati dopo una chiamata e quali no 4. La funzione può avere bisogno di variabili locali se non bastano i registri stabiliti.

9 Convenzioni: REGISTRI Registri usati per passare parametri e risultati: $a0-$a3 argomenti di una funzione $v0-$v1 risultato di una funzione (32/64 bit) E se ho bisogno di più byte? Registri preservati tra le chiamate $t0-$t9 e $ra non vengono preservati tra le chiamate E se ho bisogno di preservarli? $s0-$s7 vengono preservati tra le chiamate Come si fanno a preservare se li uso? E se non mi bastano i registri che ci sono per scrivere una funzione particolarmente complessa?

10 ACTIVATION FRAME Ogni funzione necessita di uno spazio di memoria per Memorizzare i valori passati alla funzione come argomenti Salvare i registri che una funzione può modificare, ma che il chiamante si aspetta che vengano preservati Fornire spazio per le variabili locali della procedura (se non ho abbastanza registri da utilizzare) Questo spazio viene chiamato frame di attivazione della funzione

11 f:sw $ra,fFrame li $a0,5 li $t0,12 move $a0, $t0 jal p lw $ra,fFrame jr $ra p:sw $ra,pFrame addi $s0,$a0,1 sw $s0,pFrame+4 jal q lw $s0,pFrame+4 addi $v0,$s0,3 lw $ra,pFrame jr $ra q:li $s0,1 move $s1,$s0 lw $s0,qFrame lw $s1,qFrame+4 jr $ra.data fFrame:.space 4 # spazio per $ra pFrame:.space 8 # spazio per $ra e $s0 Frame di attivazione statico

12 fact:sw $ra,factFrame ble $a0,1,base sw $a0,factFrame+4# salva n subu $a0,$a0,1 jal fact# fact(n-1) lw $t0,factFrame+4# carica n mul $v0,$t0,$v0# n*(n-1)! j end base:li $v0,1# caso base end:lw $ra,factFrame jr $ra.data factFrame:.space 8# spazio per $ra e n Un singolo frame per funzione non è sufficiente nel caso di funzioni ricorsive Da qui il nome: frame di attivazione perché è necessario un frame per ogni attivazione (chiamata) di funzione Come faccio ad allocare del nuovo spazio in memoria ogni volta che chiamo una funzione? uso lo STACK Frame di attivazione e funz. ricorsive

13 STACK Last-in, first-out (LIFO) I frame di attivazione di funzione vengono creati e distrutti seguendo un modello last-in, first-out È quindi possibile memorizzarli in uno stack Operazioni sullo stack: push: inserisce un frame nello stack, inserendolo in ultima posizione pop: rimuove lultimo frame dallo stack read/write: nel frame corrente (ultimo elemento) dello stack

14 STACK Stack Frame precedente Argomento … Argomento 7 Argomento 6 Argomento 5 Stack Frame Registri salvati Variabili temporali e locali Argomenti chiamate $sp STACK FRAME Uno stack frame contiene: Registri salvati Variabili locali e temporanee Argomenti per le funzioni chiamate dalla funzione (massimo numero richiesto; si conta dal quinto) È accessibile da: Stack pointer $sp Lo stack cresce verso gli indirizzi più bassi della memoria (Per procedere devo sottrarre) NB La dimensione del frame deve essere un multiplo di 8 byte

15 f:... subu $sp,$sp,24 sw $s0,20($sp) sw $s1,16($sp) sw $ra,12($sp) # 3 var locali (word) # 0 ulteriori argomenti jal p lw $ra,12($sp) lw $s1,16($sp) lw $s0,20($sp) addu $sp,$sp,24... jr $ra Alloco nello stack uno spazio sufficiente a contenere tutti i registri che devo salvare, le variabili locali e il numero max di argomenti. Salvo i registri $s0-$s7 che intendo usare e $ra Se la funzione chiamata richiede più di 4 argomenti li metto nello stack. Se voglio preservare i registri $t0-$t9,$a0- $a3,$v0-$v1 devo salvarli prima della chiamata a funzione e ripristinarli dopo. Ripristino i registri salvati $ra, $s0-$s7. Libero lo spazio sullo stack allocato allinizio Convenzioni: Funzioni non foglia

16 p:... subu $sp,$sp,16 sw $s0,12($sp) sw $s1,8($sp) sw $s2,4($sp) # 1 var locale # 0 ulteriori arg. jal q lw $s0,12($sp) lw $s1,8($sp) lw $s2,4($sp) addu $sp,$sp,16... jr $ra q:... jr $ra 1. Alloco nello stack uno spazio sufficiente a contenere tutti i registri che devo salvare e le eventuali variabili locali (N.B.: non serve salvare lindirizzo di ritorno $ra) 2. Salvo i registri $s0-$s7 che intendo usare 3. Ripristino i registri salvati $s0-$s7. 4. Libero lo spazio sullo stack allocato allinizio STACK ($s0) ($s1) ($s2) $sp NB. Se non uso i registri $s0- $s7 e non ho variabili locali non ho bisogno di fare nulla! Convenzioni: Funzioni foglia

17.data n:.word 7 result:.word 0.text main: lw $a0,n jal fact #fact(n) sw $v0,result fact: ble $a0,1,base subu $sp,$sp,8 sw $ra,4($sp) sw $a0,0($sp) #salva n subu $a0,$a0,1 jal fact #fact(n-1) lw $t0,0($sp) #carica n mul $v0,$t0,$v0 #n*(n-1)! lw $ra,4($sp) addu $sp,$sp,8 jr $ra base:li $v0,1 #caso base jr $ra Fattoriale (Ricorsivo)

18 fact: ble $a0,1,base #$a0 n move $v0,$a0 #$v0 risultato loop: subu $a0,$a0,1 mul $v0,$v0,$a0 #n*(n-1)*(n-2)… bgt $a0,2,loop jr $ra base: li $v0,1 #caso base jr $ra Non bisogna usare lo stack Il risultato è molto più efficiente sia in spazio che in tempo NB I compilatori dei linguaggi ad alto livello sono in genere abbastanza intelligenti da fare traduzioni iterative anche di funzioni ricorsive (quando è ragionevole). Fattoriale (Iterativo)

19 Il risultato occupa più spazio ma calcola in tempo costante i risultati più richiesti N.B.: i compilatori dei linguaggi ad alto livello non fanno questo genere di ottimizzazioni perché non sanno se ne vale la pena. Le macchine virtuali si. fact:ble $a0,10,base# $a0 = n move $v0,$a0# $v0 = risultato loop:subu $a0,$a0,1 mul $v0,$v0,$a0# n*(n-1)*(n-2)… bgt $a0,2,loop jr $ra base:mul $a0,$a0,4# caso precalcolato lw $v0,table($a0) jr $ra.data table:.word 1,1,2,6,24,120,720,5040,40320,362880, Fattoriale (Precalcolato)