Esercitazione 4 Chiamate di procedure Claudia Raibulet
Procedure Una procedura – simile ad una spia che parte con un piano segreto, aquisisce risorse, svolge dei lavori, nasconde le tracce e torna al punto di partenza con dei risultati quando la missione è completata Osservazione: la spia opera soltanto in base a ciò che deve sapere e non può fare assunzioni di che l’ha assoldata
Scopo delle procedure Strutturare i programmi Rendere i programmi più facili da capire Permettere il riutilizzo del codice I parametri rappresentano una barriera fra la procedura e il resto del programma e permettono lo scambio dei dati
Passi per chiamare una procedura Per l’esecuzione di una procedura, un programma deve eseguire i seguenti sei passi: 1.mettere i parametri in un posto dove la procedura possa recuperarli 2.trasferire il controllo alla procedura 3.allocare le risorse (di memorizzazione dei dati) necessarie alla procedura 4.effettuare la computazione della procedura 5.mettere i risultati in un posto accessibile al chiamante 6.restituire il controllo al chiamante
Convenzione uso registri per il passaggio di parametri a procedure La procedura A, durante la sua esecuzione, chiama la procedura B. La procedura B esegue i suoi compiti senza chiamare nessuna altra procedura. L’interfaccia tra A e B segue le convenzioni di uso dei registri per il passaggio parametri. Indicare qualli delle seguenti scelte sono necessarie per garantire un risultato corretto. La procedura B richiede 2 parametri in ingresso (scalari a 32 bit) e fornisce uno scalare a 32 in uscita. 1.il programmatore della procedura A non si deve interessare del passaggio dei parametri perchè questo viene gestito dall’assemblatore 2.la procedura A, prima di effettuare la chiamata a B, imposta i parametri attuali nei registri $v0, $v1 3.la procedura A, prima di effettuare la chiamata a B, imposta i parametri attuali nei registri $t0, $t1 4.la procedura A, prima di effettuare la chiamata a B, imposta i parametri attuali nei registri $s0, $s1 5.la procedura A, prima di effettuare la chiamata a B, imposta i parametri attuali nei registri $a0, $a1
Convenzione uso registri per il passaggio di parametri a procedure La procedura A, durante la sua esecuzione, chiama la procedura B. La procedura B esegue i suoi compiti senza chiamare nessuna altra procedura. L’interfaccia tra A e B segue le convenzioni di uso dei registri per il passaggio parametri. Indicare qualli delle seguenti scelte sono necessarie per garantire un risultato corretto.La procedura B richiede 2 parametri in ingresso (scalari a 32 bit) e fornisce uno scalare a 32 in uscita. 1.la procedura A, al termine della procedura B, trova i parametri di uscita nei registri $a0, $a1 2.la procedura A, al termine della procedura B, trova i parametri di uscita nei registri $t0, $t1 3.la procedura A, al termine della procedura B, trova i parametri di uscita nei registri $v0, $v1 4.la procedura A, al termine della procedura B, trova i parametri di uscita nei registri $s0, $s1 5.il programmatore della procedura B non si deve interessare del passaggio dei parametri perchè questo viene gestito dall’assemblatore
Convenzione uso registri per il passaggio di parametri a procedure $a0 - $a3 -> quattro registri argomento per il passaggio dei parametri $v0 - $v1 -> due registri valore per la restituzione dei valori $ra ->registro di ritorno per tornare al punto di origine Procedura chiamante A.... //argomenti in $a0 - $a3 jal B //valore ritornato in $v0, $v1 Procedura chiamata B //leggi argomenti da $a0 - $a3.... //salva valore calcolato in $v0, $v1 jr $ra
Esercizio 1 Si chiede di scrivere una procedura che incrementa il valore ricevuto come argomento di ingresso..globl proc proc: addi $a0, $a0, 1 move $v0, $a0 jr $ra.globl __start.data numero:.word 123.text __start: lw $a0, numero jal proc move $a0, $v0 li $v0, 1 syscall
Esercizio 2 Si chiede di scrivere una procedura che calcola il prodotto tra due numeri interi specificati come argomenti di ingresso..globl prodotto prodotto: mul $t0, $a0, $a1 move $v0, $t0 jr $ra.text __start: la $a0, inMsg li $v0, 4 syscall li $v0, 5 syscall move $a0, $v0 li $v0, 5 syscall move $a1, $v0 jal prodotto move $a0, $v0 li $v0, 1 syscall
Esercizio 3 Si chiede di scrivere una procedura che ricevendo come valori di ingresso l’indirizzo di un array di 10 elementi, e un numero compreso tra 0 e 9, ritorna l’elemento dell’array che si trova nella posizione indicata dal secondo argomento della procedura..globl estraiElemento estraiElemento: mul $t0, $a1, 4 # calcolo spiazzamento add $t0, $t0, $a0 # calcolo indice assoluto lw $t1, 0($t0) # caricamento elemento move $v0, $t1 # metto il valore di ritorno in $v0 jr $ra # ritorno al chiamante
.globl __start.data vett:.word 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 in_msg:.asciiz "Inserisci l'indice dell'elemento che vuoi estrarre\n" out_msg:.asciiz "Elemento estratto: ".text __start:li $v0, 4 # stampa messaggio per input la $a0, in_msg syscall li $v0, 5# leggi intero syscall la $a0, vett move $a1, $v0 jal estraiElemento move $s1, $v0 li $v0, 4 # stampa messaggio di output la $a0, out_msg syscall li $v0, 1 # stampa l'elemento estratto move $a0, $s1 syscall
Esercizio 4 Si chiede di scrievere una procedura che riceve in ingresso 3 numeri interi e calcola il minimo di essi..globl calcolaMinimo calcolaMinimo: slt $t0, $a0, $a1 beq $t0, $0, label1 move $t7, $a0 j label2 label1: move $t7, $a1 label2:slt $t0, $a2, $t7 beq $t0, $0, exit move $t7, $a2 exit: move $v0, $t7 jr $ra
.globl __start.data in_msg:.asciiz "Inserisci tre numeri: \n" out_msg:.asciiz "Il numero minimo inserito: ".text __start:li $v0,4 # stampa del messaggio per input la $a0,in_msg syscall li $v0,5 # read_int syscall move $a0, $v0 li $v0,5 # read_int syscall move $a1, $v0 li $v0,5 # read_int syscall move $a2, $v0 jal calcolaMinimo # chiamata della procedura move $s0, $v0 li $v0, 4 # stampa messaggio di output la $a0, out_msg syscall li $v0,1 # stampa dell'elemento estratto move $a0,$s0 syscall
Esercizio 5 Si chiede di scrivere una procedura che calcola la media degli elementi di un array..globl media media: move $t0, $a0 move $t1, $a1 move $t7, $0 ciclo:beq $t1, $0, EXIT lw $t2, 0($t0) addi $t0, $t0, 4 add $t7, $t7, $t2 addi $t1, $t1, -1 j ciclo EXIT:divu $v0, $t7, $a1 jr $ra.globl __start.data vett:.word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 dim:.word 10 outMsg:.asciiz "La media e': ".text __start: la $a0, vett lw $a1, dim jal media move $s0, $v0 la $a0, outMsg li $v0, 4 syscall move $a0, $s0 li $v0, 1 syscall
Prova di valutazione Sapendo che la cifra "0" ha codice ASCII 0x30, a quale carattere ASCII corrisponde il codice binario ? 1.'\t' C 4.0x '\n' 8.nessuna delle altre risposte 9.non rispondo
Prova di valutazione Che cosa è una pseudo-istruzione in assembly MIPS? 1.una istruzione simbolica mai utilizzata nei programmi assembly 2.una istruzione macchina usata al posto di altre istruzioni assembly 3.una istruzione simbolica che viene tradotta in una o più istruzioni macchina 4.una istruzione simbolica inesistente 5.nessuna delle altre risposte 6.non rispondo
Prova di valutazione Facendo riferimento alla Appendice A del testo dire a quale dei seguenti codici macchina in esadecimale corrisponde l'istruzione MIPS "jr $t3" (come usuale si suggerisce di non usare la tabella a pagina A-54 della Appendice A del testo, ma le pagine successive)? 1.0x x x x x x nessuna delle altre risposte 8.non rispondo
Prova di valutazione Inserire, nel Data Segment, il valore -0x74d40011 all'indirizzo 0x Quale delle seguenti prime righe del Data Segment è corretta? È visualizzata soltanto la prima riga del Data Segment, dalla locazione [0x ] alla [0x C] 1.0x x x74d x x x74d x x x x8b2bffef 0x x x x x8b2bffef 0x x x x74d x x x x8c3ffffc 0x nessuna delle altre risposte 8.non rispondo
Prova di valutazione Dato il seguente frammento di codice: dire quale dei seguenti valori assume l'etichetta "eol": 1.0x A 2.0x x E 4.0x x x x x F 9.0x E 10.nessuna delle altre risposte 11.non rispondo.data 0x ciao:.asciiz "Ciao\n" t:.asciiz "\t" mamma:.asciiz "Mamma".space 2 eol:.asciiz "\n"
Prova di valutazione Dato il seguente frammento di codice: li $v0, 4 # codice "print_string" syscall # operazione di sistema quale delle seguenti istruzioni va collocata al posto dei puntini per stampare sulla Console la stringa collocata all'indirizzo rappresentato dalla etichetta msg? 1.lw $a0, msg 2.sw $a0, msg 3.li $a0, msg 4.la $a0, msg 5.move $a0, msg 6.lui $a0, msg 7.nessuna delle altre risposte 8.non rispondo
Prova di valutazione Dato il seguente frammento di codice: li $t2, 8 ciclo: sw $t2, 0($t0) addi $t0, $t0, 4 addi $t2, $t2, -1 j ciclo fine_ciclo: jr $ra quale delle seguenti istruzioni va collocata al posto dei puntini per scrivere nell'array di word indirizzato da $t0 i valori 8,7,6,5,4,3,2,1,0? 1.bgtz $t2, fine_ciclo 2.bltz $t2, fine_ciclo 3.bgez $t2, fine_ciclo 4.blez $t2, fine_ciclo 5.beqz $t2, fine_ciclo 6.bnez $t2, fine_ciclo 7.nessuna delle altre risposte 8.non rispondo
Prova di valutazione Si consideri una procedura A che effettua una chiamata ad una procedura B. La procedura B richiede in ingresso due parametri (scalari a 32 bit) e fornisce uno scalare a 32 bit in uscita. La procedura A, prima di chiamare B, ha i valori da passare a B nei registri $t0 e $t2. Quale delle seguenti istruzioni permettono il corretto passaggio dei parametri a B? 1.move $a0, $t0 move $a1, $t2 2.move $t0, $a0 move $t2, $a1 3.move $v0, $t0 move $v1, $t2 4.la $a0, $t0 la $a1, $t2 5.move $a0, $t0 move $a1, $t3 6.nessuna delle altre risposte 7.non rispondo