Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - problemino Assembly
Forum - Altri Linguaggi - problemino Assembly

Avatar
mark86 (Normal User)
Newbie


Messaggi: 1
Iscritto: 31/01/2011

Segnala al moderatore
Postato alle 13:58
Lunedì, 31/01/2011
1)    E(n, k) = (n − k + 1)E(n − 1, k − 1) + kE(n − 1, k)
il mio programmino deve fare questo:

void main (m){

  inserisci m
  if m>=0 {
     for x= 1 to m do {
        print  “E(m,x)” :
        print Eulerian(m,x);
        print “/n”;
     }
  }else{
    Stampa errore inserimento m
  }

}
function Eulerian(n,k){

  if (k=1) return 1
  if (k>n) return 0
  T1= (n-k+1)* Eulerian(n-1, k-1) + k* Eulerian(n-1, k)
  return T1

}

quando lo traduco in Assembly , la ricorsiva mi da problemi.ora la posto:
eulerian:
addi     $sp, $sp, -32        # creo lo spazio nello stack
sw    $ra, 0($sp)        # salvo return address
sw    $a0, 4($sp)        # salvo il valore di  k in a0 sullo stack
sw        $a1, 8($sp)         # salvo $a1  salvo il valore di n
sw        $a2, 12($sp)         # salvo $a2
sw      $a3, 16($sp)            # salvo $a3
ble    $a0,1,equal_1
# calcolo il primo blocco : (n - k + 1)E(n - 1, k -1) #
# E(n-1,k-1)
addi      $a0, $a0, -1              # decremento k di 1  ----> k-1
addi    $a1, $a1, -1        # decremento n di 1  ----> n-1
jal     eulerian        # calcolo E(n - 1, k -1)
                # $v0 = E(n - 1, k -1)
#(n-k+1)
lw        $a0, 4($sp)         # riprendo il valore di k dallo stack
lw    $a1, 8($sp)             # riprendo il valore di n dallo stack    
sub      $a1, $a1, $a0        # decremento n di k
addi       $a3, $a1, 1             # $a3= n-k+1
mul    $a2,$a3,$v0        # $a2=(n - k + 1)E(n - 1, k -1)
move     $a3, $a2                  # sposto in $a3 il contenuto di $a2
sw       $a3, 16($sp)              # salvo $a3 sullo stack
# calcolo il secondo blocco : kE(n - 1, k) #
lw        $a0, 4($sp)         # riprendo il valore di k dallo stack
lw    $a1, 8($sp)        # riprendo il valore di n dallo stack
addi     $a1, $a1, -1        # decremento n di 1 ----> n-1
addi    $a0,$a0, 0        # lascio il k così com'è
jal     eulerian            # calcolo E(n - 1, k)
                    # $v0 = E(n - 1, k )
lw    $a0,4($sp)        # riprendo il valore di k dallo stack
mul    $a2, $a0, $v0        # calcolo kE(n - 1, k)
sw    $a2,12($sp)
lw    $a2,12($sp)
lw        $a3, 16($sp)              # riprendo il primo blocco dallo stack
add       $a3, $a3, $a2     # sommo (n - k + 1)E(n - 1, k -1) con kE(n-1, k)
move  $v0, $a3                  # sposto risultato totale in $v0
j     end            # Salta alla procedura di ripristino dello stack
equal_1:
li    $v0, 1                # salvo 1 in $v0
end:    
# Ripristina  valori dello stack
lw    $a3, 16($sp)              # ripristina i valori sullo stack
lw    $a2, 12($sp)                #     
lw    $a1, 8($sp)            #      
lw    $a0, 4($sp)
lw    $ra, 0($sp)
    
addi  $sp, $sp, 32        # ripristino $sp
      
jr  $ra                # ritorno ricorsione


non riesco a trovare l'errore........x' quando richiamo la ricorsiva nel 2°blocco mi va in loop.........qualcuno mi può aiutare per favore?:d

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:17
Lunedì, 31/01/2011
riformatta il codice dentro i tag [ code ] perchè non si capisce niente...

Poi di che Assembly sai parlando? A occhio sembra MIPS o SPARC, potresti essere più specifico?

Ciao

Ultima modifica effettuata da TheKaneB il 31/01/2011 alle 21:18
PM