Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Architettura degli elaboratori e delle reti
 
Ricorsione MIPS
Clicca QUI per vedere il messaggio nel forum
LOSTMAN
salve raga sono disperato qualcuno potrebbe dirmi le regole base per fare una funzione ricorsiva
ovviamente
sono casi base
e ricorsione
ma come si implementano in assembler mips
ad esempio questa come se fa
function recur(n:integer,z:integer):integer;
var m:integer;
begin
x=resto di n/5
if (x<0)
then recur :=1
else m:=call(z)
recur:=(recur(m)+recur(x))
end;

:?:?:?:?:?:?

LOSTMAN
nessuno ci riesce

lordghost
ti posto quello che avevo fatto io. calcola se non ricordo male il fattoriale di n... ancora oggi non capisco perchè mi sia stato valutato solo 26?!?!?:evil:
È abbastanza commentato, quindi spero ti possa essere utile. Non mi chiedere come funziona perchè non mi ricordo :D
PHP:

# programma per il calcolo ricorsivo di n! 

.data
msgn
:     .asciiz &quot;Inserire n:&quot;
msgk:     .asciiz &quot;Inserire k:&quot;
msgr:     .asciiz &quot;Risultato:&quot;
msgx:     .asciiz &quot;\nPremere qualsiasi tasto per uscirec per continuare&quot;
msgend:    .asciiz &quot;\nProgramma terminato&quot;
msgreb:    .asciiz &quot;\n\nRiavvio del programma\n&quot;
chr :   .asciiz &quot; &quot;  # buffer per la lettura del carattere di uscita

.text
.globl main

main
:

# Lettura di n
letturan:
  
li $v04           # $v0 codice della print_string
  
la $a0msgn      # $a0 indirizzo della stringa
  
syscall             # stampa della stringa

  
li $v05           # $v0 codice della read_int
  
syscall             # legge l’intero n e lo carica in $v0

  
bltz $v0letturan
  move $s0
$v0

# Lettura di k
letturak:
  
li $v04           # $v0 codice della print_string
  
la $a0msgk      # $a0 indirizzo della stringa
  
syscall             # stampa della stringa

  
li $v05           # $v0 codice della read_int
  
syscall             # legge l’intero n e lo carica in $v0

  
bltz $v0letturak
  move $s1
$v0




# Calcolo della funzione
  
move $a0$s0        # a0 = n
  
move $a1$s1        # a1 = k
  
jal  s
  abs $s0
$v0        # s0 = s(n,k)
    
# Stampa del risultato
    
li $v04        # codice della print_int
    
la $a0msgr
    syscall

    move $a0
$s0    # a0 = s0 = s(n,k)
    
li $v01        # codice della print_int
    
syscall


#uscire o continuare
  
li $v04           # $v0 codice della print_string
  
la $a0msgx      # $a0 indirizzo della stringa
  
syscall             # stampa della stringa

  
la $a0chr          # $a0 indirizzo del buffer
  
li $a12
  li $v0
8           # $v0 codice della read_int
  
syscall             # legge l’intero n e lo carica in $v0

  #move $a0, $v0
  
lb $a0chr        #0x20200063 and
  #li $t0, 255        #0x000000FF =
  #and $a0, $a0, $t0    #0x00000063

  
bne $a099esci

    li $v0
4        # codice della print_int
    
la $a0msgreb
    syscall   
    j letturan


# Termine del programma    
esci:
    
li $v04        # codice della print_int
    
la $a0msgend
    syscall

    li $v0
10         # $v0 codice della exit
    
syscall        # esce dal programma




 #*************************************************
********
#            PROCEDURA Stirling
 #*************************************************
********

s:
  
addi $sp$sp,-24          # alloca stack
  
sw   $ra20($sp)        # salvo return address
  
sw   $a016($sp)        # salvo l’argomento n
  
sw   $a112($sp)        # salvo l’argomento k
  
sw   $t08($sp)        # salvo s(n-1, k-1)
  
sw   $t14($sp)        # salvo s(n-1, k)
  
sw   $t20($sp)        # salvo 1

  #debug print (stampa n)
  #  li $v0, 1
  #  syscall

#casi 1-2

  
bnez $a1caso3    #k!=0
  
bnez $a0caso2    #n!=0
  #caso1
    
li $v01
    j end
  
#caso2
  
caso2:
    
blez $a0caso3
    li $v0
0
    j end
  caso3
:
    
bge $a0$a1caso4
    
#caso3
      
li $v00
      j end
  
#caso4
  
caso4:
    
addi $a0, -1        # n = n-1
    
addi $a1, -1        # k = k-1
    
jal s
    move $t0
$v0        # t0 = s(n-1, k-1)

    
lw $a112($sp)        # ripristina a1 = k
    
jal s
    mul $t1
$a0$v0        # t1 = (n-1)*s(n-1, k)

    
sub $v0$t0$t1        # il risultato sta in v0

end:
  
lw   $t20($sp)        # ripristino t2
  
lw   $t14($sp)        # ripristino t1
  
lw   $t08($sp)        # ripristino t0
  
lw   $a112($sp)        # ripristino parametro1
  
lw   $a016($sp)        # ripristino parametro2
  
lw   $ra20($sp)        # ripristino return address
  
addi $sp$sp24        # dealloca stack
  
jr   $ra            # ritorno al chiamante


LOSTMAN
ti ringrazio
ma purtroppo il fattoriale
e l unica che so fare perche e la piu scontata

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate