- Valerio Battaglia
-
- Ingegneria Informatica - Triennale
- Mercoledì, 09 Maggio 2007
- Subscribe via email
Comment
There are no comments made yet.
Se qualcuno può darmi una mano(magari il prof
) non capisco l'errore di questo codice fatto da me per il fattoriale
# Fattoriale
.text
.globl main
main:
lw $a0,x
jal fatt
sw $v0,y
exit:
jr $ra
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,1,exit
addi $a0,$a0,-1
jal fatt
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0
jr $ra
.data
x: .word 5
y: .word 0
# Fattoriale
.text
.globl main
main:
lw $a0,x
jal fatt
sw $v0,y
exit:
jr $ra
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,1,exit
addi $a0,$a0,-1
jal fatt
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0
jr $ra
.data
x: .word 5
y: .word 0
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 61
exit: jr $ra usato sia dal main che dal fact mi sembra molto poco elegante e da evitare. ma, ad occhio, il vero problema è che lei non imposta $v0 quando n<=1. la procedura (che mi sembra termini) immagino restituisca sempre 0. l'ha mai eseguita passo passo?
Inviato: Ven, 1 Giu 2007 - 16:33 Oggetto:
--------------------------------------------------------------------------------
Se qualcuno può darmi una mano(magari il prof ) non capisco l'errore di questo codice fatto da me per il fattoriale
# Fattoriale
.text
.globl main
main:
lw $a0,x
jal fatt
sw $v0,y
exit:
jr $ra
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,1,exit
addi $a0,$a0,-1
jal fatt
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0
jr $ra
.data
x: .word 5
y: .word 0
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 62
exit: jr $ra usato sia dal main che dal fact mi sembra molto poco elegante e da evitare. ma, ad occhio, il vero problema è che lei non imposta $v0 quando n<=1. la procedura (che mi sembra termini) immagino restituisca sempre 0. l'ha mai eseguita passo passo?
Grazie mille,il problema dello 0 dipendeva dal fatto che non avevo impostato il fattoriale per n<=1,però ora ho notato che il risultato viene sballato :shock: :shock:
Posto il codice nuovo nel quale ho messo delle etichette nuove per vedere i valori dei registri mentre lavoro,e sembra quasi che la macchina sbagli le moltiplicazioni O_o; se infatti lei guarda le words noterà che arrivato ad un certo punto,la moltilicazione 6(valore di $v0) * 4(valore di $a0) ritorna 18 e così per $a0 == 5
# Fattoriale
.text
.globl main
main:
lw $a0,x
jal fatt
sw $v0,y
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,1,exit
addi $a0,$a0,-1
sw $a0,z
jal fatt
sw $v0,z
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
sw $a0,k
mul $v0, $a0, $v0
sw $v0,w
jr $ra
exit:
addi $v0,$0,1
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
jr $ra
.data
x: .word 5
y: .word 0
z: .word 0
k: .word 0
w: .word 0
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 63
Buongiorno! scusate qualcuno sa dirmi dove posso trovare gli esami passati tipo quello che ha fatto vedere in aula il prof? grazie
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 64
Accepted Answer
Pending Moderation
Non so perche usi tutti quei load da .data, ma cmq così funziona:
[code type="markup"]# Fattoriale
.text
.globl main
main:
addi $sp,$sp,-4
sw $ra,0($sp)
lw $a0,x
jal fatt
add $s0, $zero, $v0
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,0,exit
addi $v0,$0,1
addi $sp,$sp,8
jr $ra
exit:
addi $a0,$a0,-1
jal fatt
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
sw $a0,k
mul $v0, $a0, $v0
sw $v0,w
jr $ra
.data
x: .word 4
y: .word 0
z: .word 0
k: .word 0
w: .word 0[/code]
[code type="markup"]# Fattoriale
.text
.globl main
main:
addi $sp,$sp,-4
sw $ra,0($sp)
lw $a0,x
jal fatt
add $s0, $zero, $v0
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
fatt:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,0,exit
addi $v0,$0,1
addi $sp,$sp,8
jr $ra
exit:
addi $a0,$a0,-1
jal fatt
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
sw $a0,k
mul $v0, $a0, $v0
sw $v0,w
jr $ra
.data
x: .word 4
y: .word 0
z: .word 0
k: .word 0
w: .word 0[/code]
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 65
Tutte le informazioni sul corso 2005/06 sono disponibili al seguente URL:
http://www.ce.uniroma2.it/~lopresti/Did ... _frame.htm
http://www.ce.uniroma2.it/~lopresti/Did ... _frame.htm
Buongiorno! scusate qualcuno sa dirmi dove posso trovare gli esami passati tipo quello che ha fatto vedere in aula il prof? grazie
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 66
Quei load li uso per avere informazioni in tempo reale dei vari contenuti dei registri,almeno caricandoli in memoria posso essere sicuro del loro valore....e cmq quel codice sulla mia macchina quando arriva a fare 4*6(con il 6 il prodotto di 3*2*1) mi da 18,e poi 18 *5 fa 78...non so proprio perchè
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 67
scusate,ma sono un idiota
! Calcolavo il valore della memoria in decimale invece che in esadecimale...quindi 78 è 120 in decimale ed è giusto
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 68
Accepted Answer
Pending Moderation
per quanto riguarda l esercizio che ha dato da fare sulla matrice noi conosciamo:
l'indirizzo base della matrice
e l'indirizzo base della colonna k-esima..
ma il numero di colonne lo sappiamo ? o possiamo usare un valore a piacere ?
grazie
l'indirizzo base della matrice
e l'indirizzo base della colonna k-esima..
ma il numero di colonne lo sappiamo ? o possiamo usare un valore a piacere ?
grazie
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 69
Accepted Answer
Pending Moderation
io penso che noi conosciamo l'indirizzo base dell'array che poi noi "vediamo" essere una matrice. La k-esima colonna (o meglio il suo primo elemento) non è altro che un opportuno offset dall'indirizzo base...almeno così ho capito
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 70
Il numero di colonne è noto (non si potrebbe svolgere l'esercizio altrimenti). In C(C++) è necessario passare l'indirizzo base della matrice ed il numero di colonne ad una funzione.
per quanto riguarda l esercizio che ha dato da fare sulla matrice noi conosciamo:
l'indirizzo base della matrice
e l'indirizzo base della colonna k-esima..
ma il numero di colonne lo sappiamo ? o possiamo usare un valore a piacere ?
grazie
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 71
Accepted Answer
Pending Moderation
thx
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 72
Accepted Answer
Pending Moderation
Dal primo esonero dello scorso anno.
[code type="markup"]1. quale sia il contenuto del campo indirizzo dell’istruzione bne al termine della
fase di assemblaggio;
Loop: slti $t0, $s2, 5
bne $t0, $a0, End
addi $s0, $s1, $s2
add $s2, $s2, 1
j Loop
End: add $v0, $s0, $zero[/code]
Il compilatore mi dice 12byte di offset calcolati come
[code type="markup"]
[0x00400004] 0x15040003 bne $8, $4, 12 [End-0x00400004] ; 4: bne $t0, $a0, End[/code]
Ma come si vede dalla riga qui sotto l'etichetta END (corrispondente all'ottava riga) si trova in posizione 00400014
[code type="markup"][0x00400014] 0x02001020 add $2, $16, $0 ; 8: add $v0, $s0, $zero[/code]
Dunque 14h-4h = 10h ---> 16 in decimale.
A mio parere il calcolo è giusto (perchè poi facendo OFFSET + (PC+4) torna l'indirizzo esatto ovvero 12 + (00004+4) = 00014h ma è l'indicazione "End-0x00400004" a essere un pò fuorviante...
...pareri?
[code type="markup"]1. quale sia il contenuto del campo indirizzo dell’istruzione bne al termine della
fase di assemblaggio;
Loop: slti $t0, $s2, 5
bne $t0, $a0, End
addi $s0, $s1, $s2
add $s2, $s2, 1
j Loop
End: add $v0, $s0, $zero[/code]
Il compilatore mi dice 12byte di offset calcolati come
[code type="markup"]
[0x00400004] 0x15040003 bne $8, $4, 12 [End-0x00400004] ; 4: bne $t0, $a0, End[/code]
Ma come si vede dalla riga qui sotto l'etichetta END (corrispondente all'ottava riga) si trova in posizione 00400014
[code type="markup"][0x00400014] 0x02001020 add $2, $16, $0 ; 8: add $v0, $s0, $zero[/code]
Dunque 14h-4h = 10h ---> 16 in decimale.
A mio parere il calcolo è giusto (perchè poi facendo OFFSET + (PC+4) torna l'indirizzo esatto ovvero 12 + (00004+4) = 00014h ma è l'indicazione "End-0x00400004" a essere un pò fuorviante...
...pareri?
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 73
Ho finito l'esercizio del compito del 21 luglio scorso,lo posto sperando che sia giusto :lol:
# Compito 21 luglio
.text
.globl main
main:
lw $a0,x
la $a1,array
lw $a2,dimensione
jal procedura
procedura:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
beq $a0,0,exitprocedura
jal is_in
beq $v1,1,fineprocedura
j fineprocedura2
fineprocedura:
addi $a0,$a0,-1
jal procedura
mul $v0,$v0,2
addi $v0,$v0,1
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
jr $ra
fineprocedura2:
addi $a0,$a0-1
jal procedura
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
addi $v0,$v0,2
jr $ra
exitprocedura:
lw $a0,0($sp)
lw $ra,0($sp)
addi $sp,$sp,8
add $v0,$0,$0
jr $ra
is_in:
addi $sp,$sp,-4
sw $ra,0($sp)
add $t1,$0,$0
add $t3,$0,$0
j loop
loop:
slt $t2,$t1,$a2
beq $t2,0,exit1loop
sll $t3,$t1,2
add $s0,$t3,$a1
lw $s1,0($s0)
beq $a0,$s1,exit2loop
addi $t1,$t1,1
j loop
exit1loop:
lw $ra,0($sp)
addi $sp,$sp,4
add $v1,$0,$0
jr $ra
exit2loop:
lw $ra,0($sp)
addi $sp,$sp,4
add $v1,$0,1
jr $ra
.data
x: .word 9
array: .word 2,4,7,6,5
dimensione: .word 5
# Compito 21 luglio
.text
.globl main
main:
lw $a0,x
la $a1,array
lw $a2,dimensione
jal procedura
procedura:
addi $sp,$sp,-8
sw $ra,4($sp)
sw $a0,0($sp)
beq $a0,0,exitprocedura
jal is_in
beq $v1,1,fineprocedura
j fineprocedura2
fineprocedura:
addi $a0,$a0,-1
jal procedura
mul $v0,$v0,2
addi $v0,$v0,1
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
jr $ra
fineprocedura2:
addi $a0,$a0-1
jal procedura
lw $a0,0($sp)
lw $ra,4($sp)
addi $sp,$sp,8
addi $v0,$v0,2
jr $ra
exitprocedura:
lw $a0,0($sp)
lw $ra,0($sp)
addi $sp,$sp,8
add $v0,$0,$0
jr $ra
is_in:
addi $sp,$sp,-4
sw $ra,0($sp)
add $t1,$0,$0
add $t3,$0,$0
j loop
loop:
slt $t2,$t1,$a2
beq $t2,0,exit1loop
sll $t3,$t1,2
add $s0,$t3,$a1
lw $s1,0($s0)
beq $a0,$s1,exit2loop
addi $t1,$t1,1
j loop
exit1loop:
lw $ra,0($sp)
addi $sp,$sp,4
add $v1,$0,$0
jr $ra
exit2loop:
lw $ra,0($sp)
addi $sp,$sp,4
add $v1,$0,1
jr $ra
.data
x: .word 9
array: .word 2,4,7,6,5
dimensione: .word 5
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 74
ragazzi sapete dirmi cosa non va in questo codice, dato che continua ad ignorarmi l'etichetta Exit ? il for continua a loopare anche quando il puntatore che punta all'elemento A[0] è uguale al puntatore che punta A[n]
# Calcola il massimo di un array
.text
.globl main
main:
la $a0, array
la $a1, N
addi $sp, $sp, -4
sw $ra, 0($sp)
jal proc_max
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
proc_max: add $a0, $0, $0 # $a0 = &A[0]
sll $t6, $a1, 2 # $t6 = 4*n
add $t6, $a0, $t6 # $t6 = &A[n]
add $v0, $zero, $0 # max = $v0 = 0
For: beq $a0, $t6, Exit
lw $t1, 0($a0)
slt $t2, $v0, $t1
bne $t2, $zero, change
End_For: addi $a0, $a0, 4
j For
change: add $v0, $t1, $0
j End_For
Exit: jr $ra
.data
array: .word 1, 3, 1, 6, 1
N: .word 5
# Calcola il massimo di un array
.text
.globl main
main:
la $a0, array
la $a1, N
addi $sp, $sp, -4
sw $ra, 0($sp)
jal proc_max
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
proc_max: add $a0, $0, $0 # $a0 = &A[0]
sll $t6, $a1, 2 # $t6 = 4*n
add $t6, $a0, $t6 # $t6 = &A[n]
add $v0, $zero, $0 # max = $v0 = 0
For: beq $a0, $t6, Exit
lw $t1, 0($a0)
slt $t2, $v0, $t1
bne $t2, $zero, change
End_For: addi $a0, $a0, 4
j For
change: add $v0, $t1, $0
j End_For
Exit: jr $ra
.data
array: .word 1, 3, 1, 6, 1
N: .word 5
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 75
ragazzi sapete dirmi cosa non va in questo codice, dato che continua ad ignorarmi l'etichetta Exit ? il for continua a loopare anche quando il puntatore che punta all'elemento A[0] è uguale al puntatore che punta A[n]
# Calcola il massimo di un array
.text
.globl main
main:
la $a0, array
la $a1, N
addi $sp, $sp, -4
sw $ra, 0($sp)
jal proc_max
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
proc_max: add $a0, $0, $0 # $a0 = &A[0]
sll $t6, $a1, 2 # $t6 = 4*n
add $t6, $a0, $t6 # $t6 = &A[n]
add $v0, $zero, $0 # max = $v0 = 0
For: beq $a0, $t6, Exit
lw $t1, 0($a0)
slt $t2, $v0, $t1
bne $t2, $zero, change
End_For: addi $a0, $a0, 4
j For
change: add $v0, $t1, $0
j End_For
Exit: jr $ra
.data
array: .word 1, 3, 1, 6, 1
N: .word 5
Ci sono un po di cose che non mi sono chiare nel codice che hai scritto,però intanto ti posso dire che l'istruzione
add $a0, $0, $0 # $a0 = &A[0]
è sbagliata,perchè così facendo,tu hai $a0 = 0,e non l'indirizzo del primo elemento dell'aray
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 76
sì scusa ho sbagliato, sarebbe add $a0, $0, $a0
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 77
ad ogni modo, fino a che $a0 == $t6 il codice va bene perchè in $v0 mi ritrovo giustamente 6, soltanto che quando $a0 == $t6 dovrebbe uscire, invece continua ad andare avanti, incrementandomi $a0 e ignorando l'etichetta Exit
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 78
Accepted Answer
Pending Moderation
normalmente alla fine di ogni main bisogna mettere un jr $ra per permettere di al processore di tornare al kernel (se non vado errato). ma quando si usano funzioni ricorsive l'$ra viene sovrascritto e mettendo un jr $ra alla fine del main, si tornerebbe ciclicamente all'istruzione successiva alla jal procedura_ricorsiva. Cosa bisogna fare? salvarsi l'$ra prima di chiamare la procedura? o usare la syscall con servizio 10 (exit) o altro? grazie.
in più posto un fibonacci che mi è costato 3 ore di lavoro. gioca molto sul fatto che spostando il puntatore allo stack i dati rimangono in memoria.. volevo sapere se dal professore se ci può stare una cosa del genere all'esame o se ne penalizzerebbe l'esito. grazie:
[code type="markup"]
fibonacci: addi $sp, $sp, -8 # alloco 2*word ($ra e $a0)
sw $ra, 4($sp) # salvo $ra
sw $a0, 0($sp) # salvo $a0
slti $t0, $a0, 0 # if($a0<0) $t0=1;
beq $t0, $zero, fibonacci1 # if($t0==0) goto fibonacci1;
add $v0, $zero, $zero # $v0=0;
addi $sp, $sp, 8 #dealloco 2*word
jr $ra
fibonacci1:addi $a0, $a0, -1 # decremento l'argomento
jal fibonacci # goto fibonacci
lw $a0, 0($sp) # carico n
lw $ra, 4($sp) # carico $ra
slti $t0, $a0, 2 # if($a0<2) $t0=1;
bne $t0, $zero, repeat
addi $sp, $sp, -16# alloco 4*word
lw $a1, 0($sp) # carico n-2
lw $a2, 8($sp) # carico n-1
add $v0, $a1, $a2# somma (n-2)+(n-1)
sw $v0, 16($sp) # salvo il risutalto in n
addi $sp, $sp, 24 # dealloco 6*word
j return
repeat: add $v0, $zero, $a0
addi $sp, $sp, 8
return: jr $ra
[/code]
in più posto un fibonacci che mi è costato 3 ore di lavoro. gioca molto sul fatto che spostando il puntatore allo stack i dati rimangono in memoria.. volevo sapere se dal professore se ci può stare una cosa del genere all'esame o se ne penalizzerebbe l'esito. grazie:
[code type="markup"]
fibonacci: addi $sp, $sp, -8 # alloco 2*word ($ra e $a0)
sw $ra, 4($sp) # salvo $ra
sw $a0, 0($sp) # salvo $a0
slti $t0, $a0, 0 # if($a0<0) $t0=1;
beq $t0, $zero, fibonacci1 # if($t0==0) goto fibonacci1;
add $v0, $zero, $zero # $v0=0;
addi $sp, $sp, 8 #dealloco 2*word
jr $ra
fibonacci1:addi $a0, $a0, -1 # decremento l'argomento
jal fibonacci # goto fibonacci
lw $a0, 0($sp) # carico n
lw $ra, 4($sp) # carico $ra
slti $t0, $a0, 2 # if($a0<2) $t0=1;
bne $t0, $zero, repeat
addi $sp, $sp, -16# alloco 4*word
lw $a1, 0($sp) # carico n-2
lw $a2, 8($sp) # carico n-1
add $v0, $a1, $a2# somma (n-2)+(n-1)
sw $v0, 16($sp) # salvo il risutalto in n
addi $sp, $sp, 24 # dealloco 6*word
j return
repeat: add $v0, $zero, $a0
addi $sp, $sp, 8
return: jr $ra
[/code]
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 79
io comunque ho risolto! :wink:
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 80
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 »