<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.dsy.it/index.php?action=history&amp;feed=atom&amp;title=Architettura_degli_elaboratori_Turno_3%2FProgetti%2FStirling</id>
	<title>Architettura degli elaboratori Turno 3/Progetti/Stirling - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dsy.it/index.php?action=history&amp;feed=atom&amp;title=Architettura_degli_elaboratori_Turno_3%2FProgetti%2FStirling"/>
	<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Architettura_degli_elaboratori_Turno_3/Progetti/Stirling&amp;action=history"/>
	<updated>2026-05-23T15:32:21Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Architettura_degli_elaboratori_Turno_3/Progetti/Stirling&amp;diff=12255&amp;oldid=prev</id>
		<title>Yoruno il 14:43, 1 mar 2006</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Architettura_degli_elaboratori_Turno_3/Progetti/Stirling&amp;diff=12255&amp;oldid=prev"/>
		<updated>2006-03-01T14:43:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Stirling&lt;br /&gt;
  #&lt;br /&gt;
  # Programma sviluppato con MIPSter 1.04, PCSpim 1.0, SPIM 6.5 su Windows 2000&lt;br /&gt;
  # Il programma calcola la ricorrenza dei numeri di Stirling di seconda specie&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
        .data&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Stringhe di testo utilizzate dal programma.&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  ask_n: &lt;br /&gt;
   	.asciiz &amp;quot;\nInserisci n per S(n,k): &amp;quot;&lt;br /&gt;
  ask_k:&lt;br /&gt;
  	.asciiz &amp;quot;\nInserisci k per S(n,k): &amp;quot;&lt;br /&gt;
  risultato_a:&lt;br /&gt;
  	.asciiz &amp;quot;\nS(&amp;quot;&lt;br /&gt;
  risultato_b:&lt;br /&gt;
  	.asciiz &amp;quot;,&amp;quot;&lt;br /&gt;
  risultato_c:&lt;br /&gt;
  	.asciiz &amp;quot;) e' uguale a &amp;quot;&lt;br /&gt;
  &lt;br /&gt;
        .text&lt;br /&gt;
  &lt;br /&gt;
        .globl main&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Corpo main del programma.&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  main:&lt;br /&gt;
        la $a0, ask_n		# Richiesta del valore n di S(n,k)&lt;br /&gt;
        li $v0, 4&lt;br /&gt;
        syscall&lt;br /&gt;
  &lt;br /&gt;
        li $v0, 5			# Memorizzazione del valore n in $t1&lt;br /&gt;
        syscall			# ($t1 utilizzato per la visualizzazione finale)&lt;br /&gt;
  	move $t1, $v0&lt;br /&gt;
  &lt;br /&gt;
        la $a0, ask_k		# Richiesta del valore n di S(n,k)&lt;br /&gt;
        li $v0, 4&lt;br /&gt;
        syscall&lt;br /&gt;
  &lt;br /&gt;
        li $v0, 5          	# Memorizzazione del valore k in $a1 e $t2&lt;br /&gt;
        syscall			# ($t2 utilizzato per la visualizzazione finale)&lt;br /&gt;
        move $a1, $v0		# ($a1 utilizzato per il calcolo di S(n,k)&lt;br /&gt;
  	move $t2, $v0&lt;br /&gt;
  &lt;br /&gt;
  	move $a0, $t1		# Memorizzazione del valore n in $a0 per S(n,k)&lt;br /&gt;
  &lt;br /&gt;
  	jal Stirling   		# Chiamata della procedura di calcolo di S(n,k)&lt;br /&gt;
  &lt;br /&gt;
  	move $t0, $v0		# Memorizzazione di S(n,k) in $t0 (temporaneo)&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  #         Visualizzazione del risultato finale della computazione.		#&lt;br /&gt;
  #         			( es.: S(5,2) è uguale a 15 )					#&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  	la $a0, risultato_a	# Visualizzazione della stringa &amp;quot;S(&amp;quot;&lt;br /&gt;
  	li $v0, 4&lt;br /&gt;
  	syscall&lt;br /&gt;
  &lt;br /&gt;
  	move $a0, $t1		# Visualizzazione di n inserito inizialmente&lt;br /&gt;
  	li $v0, 1&lt;br /&gt;
  	syscall&lt;br /&gt;
  &lt;br /&gt;
  	li $v0, 4			# Visualizzazione della stringa &amp;quot;,&amp;quot;&lt;br /&gt;
  	la $a0, risultato_b&lt;br /&gt;
  	syscall&lt;br /&gt;
  	&lt;br /&gt;
  	move $a0, $t2		# Visualizzazione di k inserito inizialmente&lt;br /&gt;
  	li $v0, 1&lt;br /&gt;
  	syscall	&lt;br /&gt;
  	&lt;br /&gt;
  	li $v0, 4			# Visualizzazione della stringa &amp;quot;) e' uguale a &amp;quot;&lt;br /&gt;
  	la $a0, risultato_c&lt;br /&gt;
  	syscall	&lt;br /&gt;
  &lt;br /&gt;
  	move $a0, $t0		# Stampa del valore di S(n,k) calcolato&lt;br /&gt;
  	li $v0, 1&lt;br /&gt;
  	syscall&lt;br /&gt;
  &lt;br /&gt;
  	li $v0, 10			# Uscita dal programma&lt;br /&gt;
  	syscall&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Calcolo di S(n,k) = S(n-1,k-1) + kS(n-1,k) tramite ricorsione.&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  Stirling:&lt;br /&gt;
  &lt;br /&gt;
  	subu $sp, $sp, 20		# Allocazione dello stack&lt;br /&gt;
  	sw $ra, 16($sp)		# Memorizzazione del return address&lt;br /&gt;
  	sw $s0, 4($sp)&lt;br /&gt;
  	move $s0, $a0		# Memorizzazione di n in $s0&lt;br /&gt;
  	sw $s1, 8($sp)&lt;br /&gt;
  	move $s1, $a1		# Memorizzazione di k in $s1&lt;br /&gt;
  	sw $s2, 12($sp)&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Test di controllo dei valori di n e k.&lt;br /&gt;
  #&lt;br /&gt;
  # Viene considerato che S(n,k) risulta essere:&lt;br /&gt;
  #&lt;br /&gt;
  # S(n,k) = 1 se n = k oppure n &amp;gt; 1 e k = 1.&lt;br /&gt;
  # S(n,k) = 0 se k &amp;gt; n.&lt;br /&gt;
  #&lt;br /&gt;
  # In tutti gli altri casi S(n,k) = S(n-1,k-1) + kS(n-1,k).&lt;br /&gt;
  #&lt;br /&gt;
  # Viene inoltre controllato che sia n, k &amp;gt; 0.&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  	beq $s0, $zero, zero	# Controllo di correttezza dei valori&lt;br /&gt;
  	beq $s1, $zero, zero	# Se n,k = 0 allora S(n,k) = 0&lt;br /&gt;
  &lt;br /&gt;
  	beq $s1, $s0, uno		# Se k = n allora S(n,k) = 1&lt;br /&gt;
  	beq $s1, 1, k_equal_1 	# Se k = 1 allora controlla se n &amp;gt; 1&lt;br /&gt;
  	bgt $s1, $s0, zero	# Se k &amp;gt; n allora S(n,k) = 0&lt;br /&gt;
  	j end_check			# In tutti gli altri casi fine controllo valori&lt;br /&gt;
  &lt;br /&gt;
  k_equal_1: 				# Se k = 1&lt;br /&gt;
  	bgeu $s0, 1, uno		# controlla se n &amp;gt; 1 e quindi S(n,k) = 1&lt;br /&gt;
  	j end_check			# altrimenti fine del controllo dei valori&lt;br /&gt;
  &lt;br /&gt;
  uno:	 				# Se k = n oppure k = 1, n &amp;gt; 1&lt;br /&gt;
  	li $v0, 1			# allora S(n,k) = 1&lt;br /&gt;
  	j snk				# e salta alla visualizzazione del valore finale&lt;br /&gt;
  &lt;br /&gt;
  zero:					# Se n = 0 oppure k = 0 oppure k &amp;gt; n&lt;br /&gt;
  	li $v0, 0			# allora S(n,k) = 0&lt;br /&gt;
  	j snk				# e salta alla visualizzazione del valore finale&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Vengono decrementati i valori di n e k secondo la formula di Stirling e si &lt;br /&gt;
  # procede alla ricorsione di S(n-1,k-1) e kS(n-1,k)&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  end_check:&lt;br /&gt;
  &lt;br /&gt;
  	addu $a0, $s0, -1		# Memorizza n = n - 1 in $a0&lt;br /&gt;
  	addu $a1,$s1,-1		# Memorizza k = k - 1 in $a1&lt;br /&gt;
  &lt;br /&gt;
  	jal Stirling		# Chiamata della procedura per S(n-1,k-1)&lt;br /&gt;
  &lt;br /&gt;
  	move $s2,$v0		# Memorizza il risultato di S(n-1,k-1) in $s2&lt;br /&gt;
  &lt;br /&gt;
  	addu $a0,$s0,-1		# Memorizza n = n - 1 in $a0&lt;br /&gt;
  	move $a1,$s1		# Memorizza k in $a1&lt;br /&gt;
  &lt;br /&gt;
  	jal Stirling	 	# Chiamata della procedura per S(n-1,k)&lt;br /&gt;
  &lt;br /&gt;
  	mul $v0,$v0,$a1		# Memorizza il risultato di kS(n-1,k) in $v0&lt;br /&gt;
   &lt;br /&gt;
  	addu $v0,$v0,$s2		# Memorizza S(n-1,k-1) + kS(n-1,k) in $v0&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # Ripristino dei valori dallo stack.&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  &lt;br /&gt;
  snk:&lt;br /&gt;
  &lt;br /&gt;
  	lw   $ra, 16($sp)		# Ripristino del return address in $ra&lt;br /&gt;
  	lw   $s0, 4($sp)		# Ripristino di n in $s0&lt;br /&gt;
  	lw   $s1, 8($sp)		# Ripristino di k in $s1	&lt;br /&gt;
  	lw   $s2, 12($sp)		# Ripristino di S(n,k) in $s2&lt;br /&gt;
  	addu $sp, $sp, 20		# Deallocazione dello stack&lt;br /&gt;
  	jr $ra			# Ritorno al chiamante&lt;br /&gt;
  &lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
  # FINE DEL PROGRAMMA&lt;br /&gt;
  #-----------------------------------------------------------------------------#&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Progetti]]&lt;/div&gt;</summary>
		<author><name>Yoruno</name></author>
		
	</entry>
</feed>