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
Se qualcuno può darmi una mano(magari il prof :D ) 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.
Accepted Answer Pending Moderation
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.
Accepted Answer Pending Moderation
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.
Accepted Answer Pending Moderation
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.
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]
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Tutte le informazioni sul corso 2005/06 sono disponibili al seguente URL:

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.
Accepted Answer Pending Moderation
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.
Accepted Answer Pending Moderation
scusate,ma sono un idiota :D ! 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.
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
Comment
There are no comments made yet.
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.
Accepted Answer Pending Moderation
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.
Accepted Answer Pending Moderation
thx
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Dal primo esonero dello scorso anno.

[code type="markup"]1. quale sia il contenuto del campo indirizzo dell&#146;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.
Accepted Answer Pending Moderation
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
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
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
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
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.
Accepted Answer Pending Moderation
sì scusa ho sbagliato, sarebbe add $a0, $0, $a0
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
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.
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]
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
io comunque ho risolto! :wink:
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!