fbpx
Skip to main content
  1. Valerio Battaglia
  2. Ingegneria Informatica - Triennale
  3. Mercoledì, 09 Maggio 2007
  4.  Subscribe via email
e quest'ultimo lo apro io :D buon lavoro a tutti..
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
ho notato un cosa curiosa :)

se dobbiamo allocare 10 variabili nello stack facciamo "scendere" il puntatore di 4*10.. se guardate cosa succede nell'emulatore.. scoprirete che in questo modo si lascia sempre una word vuota alla locazione "0x7fffeffc".

l'allocazione "senza spreco di quella word" dovrebbe essere 4*(10-1)?

ovviamente consiglio a tutti e anche a me stesso di ATTENERSI ai metodi spiegati in aula. questa è solo una curiosità

grazie :)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Salve ragazzi, non capisco l'errore in questo codice per calcolare l'n-simo numero di Fibonacci, ci sto buttando la testa qualcuno potrebbe aiutarmi grazie.

[code type="markup"]Fib:

addi $sp, $sp, -12
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)

add $s0,$0,$a0 # $s0=$a0
slti $t0, $s0, 2 # se $s0<2 $t0=1 altrimenti $t0=0
beq $t0, $0, Else
add $v0, $s0, $0
jr $ra


Else:

addi $a0, $s0, -1 # $a0=$s0-1
jal Fib # $ra= PC+4; go to Fib
add $s1, $0, $v0 # $s1=Fib(n-1) cioè $v0
addi $a0, $s0, -2 # $a0=$s0-2
jal Fib
add $v0, $v0, $s1 #$v0=$v0+$s1 cioè $v0=(Fib (n-2) + Fib (n-1))
j Exit

Exit:

lw $ra, 0($sp)
lw $s0, 4($sp)
lw $s1, 8($sp)
addi $sp, $sp, 12
jr $ra
[/code]
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
volevo aggiungere una cosa (non c'è l'EDIT qui),,
mi restituisce in $v0 sempre 1 perchè è l'ultimo valore calcolato. Se ad esempio eseguo Fib(3) lui chiama ricorsivamente Fib(2) che chiama Fib(1), il mio problema è: come fare a sommare i due risultati precedenti?devo salvare i risultati parziali ma non riesco a intuire.....ci perdo un'altro pò di tempo, intanto se qualcuno ha qualche idea..
grazie
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
questo perché $sp punta all'elemento in cima allo stack, quindi all'inizio la pila contiene una parola alla locazione 0x7fffeffc (ovvero con la convenzione che $sp punta ad un elemento dello stack, lo stack non può mai essere vuoto)

ho notato un cosa curiosa

se dobbiamo allocare 10 variabili nello stack facciamo "scendere" il puntatore di 4*10.. se guardate cosa succede nell'emulatore.. scoprirete che in questo modo si lascia sempre una word vuota alla locazione "0x7fffeffc".

l'allocazione "senza spreco di quella word" dovrebbe essere 4*(10-1)?
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
per Fibonacci questo è il codice che vi ho proposto a lezione. ora lo metto anche online...



#
#Procedura ricorsiva per il calcolo del numero di Fibonacci
#

.data
prompt: .asciiz "Inserisci un numero intero n... "
output: .ascii "Il fib(n)=: "
.text
.globl main

main: addi $sp, $sp, -8 # per salvare 2 registri nello stack
sw $ra, 4($sp) # push di $ra nello stack
sw $s0, 0($sp) # push di $s0 nello stack

li $v0, 4 # carica in $v0 il codice della print_string
la $a0, prompt # carica in $a0 l'indirizzo della stringa
syscall # stampa la stringa

li $v0, 5 # carica in $vo0 il codice della read_int
syscall # legge l'intero e lo carica in $v0

add $a0, $v0, $0
jal fib
add $s0, $v0, $0

# Stampa il risultato
li $v0, 4 # carica in $v0 il codice della print_string
la $a0, output # carica in $a0 l'indirizzo della stringa
syscall # stampa la stringa
li $v0, 1 # carica in $v0 il codice della print_int
add $a0, $s0, $0 # carica in $a0 il risultato salvato in $s0
syscall # stampa il risultato

lw $s0, 0($sp) # pop di $s0 dallo stack
lw $ra, 4($sp) # pop di $ra dallo stack
addi $sp, $sp, 8 #
jr $ra


fib: addi $sp, $sp, -12
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)

add $s0, $0, $a0 # $s0=n
slti $t0, $s0, 2 # $t0=1 iff n<2
beq $t0, $0, Else # if n>=2 goto Else
add $v0, $0, $s0 # return n
j End
Else: addi $a0, $s0, -1 # $a0=n-1
jal fib # calcola fib(n-1)
add $s1, $0, $v0 # $s0=fib(n-1)
addi $a0, $s0, -2 # $a0=n-2
jal fib # calcola fib(n-2)
add $v0, $v0, $s1 # $v0=fib(n-1)+fib(n-2)

End: lw $s1, 8($sp)
lw $s0, 4($sp)
lw $ra, 0($sp)
addi $sp, $sp, 12
jr $ra
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Prof,come mai lei all'inizio del main salva sempre il Pc+4???? Il main è una etichetta,e quindi io sono solito salvare il registro $ra dopo la chiamata di una funzione...
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Prof,come mai lei all'inizio del main salva sempre il Pc+4???? Il main è una etichetta,e quindi io sono solito salvare il registro $ra dopo la chiamata di una funzione...


vero, me lo stavo chiedendo anche io
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Perché anche main è una funzione e come tale va invocata. se guardate, le istruzioni che vengono caricate dal sistema operativo a 0x400000, e che precedono il nostro codice, servono ad inizializzare l'ambiente del programma. poi a 0x400014 c'è jail main che "salta" al nostro codice. alla fine il nostro programma deve tornare a 0x400018 (istruzione dopo il jal main). questo non sarebbe possibile se non salvassi $ra all'inizio del main stesso, così come faccio per qualsiasi funzione/procedura non foglia. spero sia chiaro.

Prof,come mai lei all'inizio del main salva sempre il Pc+4???? Il main è una etichetta,e quindi io sono solito salvare il registro $ra dopo la chiamata di una funzione...
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
grazie mille :lol: !
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
La ringrazio molto :)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
potete cortesemente postere la soluzione del compito del 21 luglio?
grazie mille^^
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
è gia online nel sito dell'anno scorso


http://www.ce.uniroma2.it/~lopresti/Did ... 210706.zip

potete cortesemente postere la soluzione del compito del 21 luglio?
grazie mille^^
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Non riesco proprio a capire come si potrebbe scrivere una condizione del tipo:

[code type="markup"]if (a<>2 && a>4)[/code]

senza usare pseudoistruzioni... qualcuno saprebbe darmi una mano??
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
supponendo $t0=2 e $t1=4 e $a0=x

[code type="markup"]

if: beq $t0, $a0, else
slt $t3, $a0, $t1
bne $t3, $zero, else
then:istruzione_then
j end_if
else:istruzione_else
end_if:altre_istruzioni

[/code]
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
come faccio a stampare un array di interi sulla console che ho memorizzato in .data sotto un'etichetta??

tipo:
.data
array: .word 1,2,3,4,5

vorrei stampare questi numero in questo ordine..
ringrazio anticipatamente..
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
[code type="markup"]
.data
A: .word 1, 3, 7, 8, 4
n: .word 5
space: .asciiz " "

.text
.globl main

main: la $t0, A #punta il primo elemento dell'array
lw $t1, n #carico in $a1 la dimensione dell'array

sll $t1, $t1, 2 #a1 conteneva il numero di elementi: n. con lo shift faccio n*4 e ottengo il numero di word
add $t1, $t1, $t0 #sommo il numero di word all'indirizzo del primo elemento e ottengo l'indirizzo dell'ultimo elemento

while: slt $t2, $t0, $t1 #se $a0<$a1, $t2=1
beq $t2, $zero, end #se $a0>=$a1, salta a end

#stampo intero
lw $a0, 0($t0) # carico in $a0 l'elemento dell'array
li $v0,1 # $v0 <- service #1
syscall # call to system service
nop # do nothing

#stampo stringa
la $a0, space # $a0 <- start of welcome message
li $v0, 4 # $v0 <- service #4
syscall # call to system service
nop # do nothing

addi $t0, $t0, 4 #incremento il puntatore di 1 word
j while
end: jr $ra #torno al chiamante (kernel)
[/code]
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
grazie valè.. ma speravo ci fosse una maniera più veloce :D
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
è assembly, mica una gita in crociera :)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
non so se la cosa è già stata afforntata, perchè si riferisce alla codifica in CP2, comunque:
sul compito del 12-07-2006 il primo esercizio secondo è sbagliato come impostazione, perchè chiede di rappresentare in CP2 con 8 cifre numeri come 0xE7, 0xDE, 0xA2, 0xE1, cosa impossibile: con 8 bit il range rappresentabile è da -128 a +127 quindi da -0x80 a 0x7F. infatti non mi ritrovavo con la soluzione degli esercizi: il primo consiste nella sottrazione 0x29-0xE7 (41-231=-190) : E7 in modulo è superiore a 29 quindi la sottrazione deve dare un risultato negativo. prima di invertire E7 infatti bisogna aggiungere uno 0 davanti, che nell'inversione diventa un 1 e, sommandosi all'altro numero, dà un risultato negativo (overflow).
spero di avere conferma o spiegazioni. grazie per l'attenzione
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
scusa, ad esempio hai la prima sottrazione, 0x29-0xe7. Li converti in binario

hai 9 = 1001
2 = 0010
quindi = 00101001

poi 7 = 0111
e = 1110
cioè = 11100111 che diventa 00011001

e poi li sommi ottenendo 66 in decimale che non dà overflow
Comment
There are no comments made yet.


There are no replies made for this post yet.
Be one of the first to reply to this post!