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 uscire, c 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 $v0, 4           # $v0 codice della print_string
  la $a0, msgn      # $a0 indirizzo della stringa
  syscall             # stampa della stringa

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

  bltz $v0, letturan
  move $s0, $v0

# Lettura di k
letturak:
  li $v0, 4           # $v0 codice della print_string
  la $a0, msgk      # $a0 indirizzo della stringa
  syscall             # stampa della stringa

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

  bltz $v0, letturak
  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 $v0, 4        # codice della print_int
    la $a0, msgr
    syscall

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


#uscire o continuare
  li $v0, 4           # $v0 codice della print_string
  la $a0, msgx      # $a0 indirizzo della stringa
  syscall             # stampa della stringa

  la $a0, chr          # $a0 indirizzo del buffer
  li $a1, 2
  li $v0, 8           # $v0 codice della read_int
  syscall             # legge l’intero n e lo carica in $v0

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

  bne $a0, 99, esci

    li $v0, 4        # codice della print_int
    la $a0, msgreb
    syscall   
    j letturan


# Termine del programma    
esci:
    li $v0, 4        # codice della print_int
    la $a0, msgend
    syscall

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




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

s:
  addi $sp, $sp,-24          # alloca stack
  sw   $ra, 20($sp)        # salvo return address
  sw   $a0, 16($sp)        # salvo l’argomento n
  sw   $a1, 12($sp)        # salvo l’argomento k
  sw   $t0, 8($sp)        # salvo s(n-1, k-1)
  sw   $t1, 4($sp)        # salvo s(n-1, k)
  sw   $t2, 0($sp)        # salvo 1

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

#casi 1-2

  bnez $a1, caso3    #k!=0
  bnez $a0, caso2    #n!=0
  #caso1
    li $v0, 1
    j end
  #caso2
  caso2:
    blez $a0, caso3
    li $v0, 0
    j end
  caso3:
    bge $a0, $a1, caso4
    #caso3
      li $v0, 0
      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 $a1, 12($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   $t2, 0($sp)        # ripristino t2
  lw   $t1, 4($sp)        # ripristino t1
  lw   $t0, 8($sp)        # ripristino t0
  lw   $a1, 12($sp)        # ripristino parametro1
  lw   $a0, 16($sp)        # ripristino parametro2
  lw   $ra, 20($sp)        # ripristino return address
  addi $sp, $sp, 24        # 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