- Valerio Battaglia
-
- Ingegneria Informatica - Triennale
- Mercoledì, 09 Maggio 2007
- Subscribe via email
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
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 81
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]
[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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 82
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
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 83
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 84
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 85
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 86
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 87
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 88
grazie mille :lol: !
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 89
Accepted Answer
Pending Moderation
La ringrazio molto
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 90
potete cortesemente postere la soluzione del compito del 21 luglio?
grazie mille^^
grazie mille^^
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 91
è gia online nel sito dell'anno scorso
http://www.ce.uniroma2.it/~lopresti/Did ... 210706.zip
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 92
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??
[code type="markup"]if (a<>2 && a>4)[/code]
senza usare pseudoistruzioni... qualcuno saprebbe darmi una mano??
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 93
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]
[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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 94
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..
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 95
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]
.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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 96
grazie valè.. ma speravo ci fosse una maniera più veloce
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 97
Accepted Answer
Pending Moderation
è assembly, mica una gita in crociera
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 98
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
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 99
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
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.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 100
There are no replies made for this post yet.
Be one of the first to reply to this post!
Be one of the first to reply to this post!
Please login to post a reply
You will need to be logged in to be able to post a reply. Login using the form on the right or register an account if you are new here. Register Here »