.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Filez (http://www.dsy.it/forum/forumdisplay.php?forumid=19)
-- q-fattoriale (http://www.dsy.it/forum/showthread.php?threadid=35237)


Posted by kernel1973 on 03-06-2008 21:05:

[D'Antona] q-fattoriale

il mio progetto


codice

#---------------------------------------------------------------------------------------#
# Progetto sviluppato su piattaforma Windows XP Home Edition Versione 2002 Service Pack 2
# Editor utilizzato MIPSter 1.04
# Simulatore PC-SPIM versione 7.1
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
# SEZIONE PER LA DICHIARAZIONE DELLE VARIABILI UTILIZZATE NEL PROGRAMMA

.data #Dichiarazione dei dati


titolo: .asciiz "**Calcolo q-fattoriale**\n"
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
## Stringhe di richiesta Input all'utente ##

dom_n: .asciiz "\nInserisci n "
dom_q: .asciiz "\nInserisci q "
end1: .asciiz "\nProgramma Terminato.Scegliere come proseguire:"
end2: .asciiz "\n\n1. Riavvia il programma"
end3: .asciiz "\n\n2. Esci dal programma\n"
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
## Stringhe di gestione e messaggi di errore ##

err_n: .asciiz "\nIl valore di n deve essere un numero intero maggiore di 0\n\n"
err_q: .asciiz "\nIl valore di q deve essere un numero intero maggiore di 0\n\n"

text_q: .asciiz "\nPer il valore q="
text_n: .asciiz " e n="
text_ris: .asciiz " il risultato di ( 1 + q ) * ( 1 + q + q^2 ) * ( 1 + q + q^2 + q^n-1 ) è "

text_bye: .asciiz "\nProgramma q-fattoriale terminato correttamente.Bye!"
#---------------------------------------------------------------------------------------#
.text #Codice del Programma

main:
li $t0,0 #inizializzo $t0=0
li $t1,0 #inizializzo $t1=0
li $t2,1 #inizializzo $t2=1
li $t3,1 #inizializzo $t3=1
li $t4,0 #inizializzo $t4=0
li $t5,0 #inizializzo $t5=0
li $t6,1 #inizializzo $t6=1
li $t7,0 #inizializzo $t7=0
li $t8,0 #inizializzo $t8=0
li $t9,0 #inizializzo $t9=0

li $v1,0 #inizializzo $v1=0


## Visualizza il TITOLO ##
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,titolo # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

## Chiedo la prima variabile q ##
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,dom_q # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string


## Leggo l'input q dell'utente e lo salvo nel registro $t0 ##
li $v0,5 # Codice di chiamata della system call per leggere un'intero
syscall # Chiamata al sistema operativo per l'esecuzione della read int
move $t0,$v0 # Salvo q in $t0

## Chiedo la seconda variabile n ##
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,dom_n # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

## Leggo l'input q dell'utente e lo salvo nel registro $t1##
li $v0,5 # Codice di chiamata della system call per leggere un'intero
syscall # Chiamata al sistema operativo per l'esecuzione della read int
move $t1,$v0 # Salvo n in $t1


#*************************************************
****************#
# Core del programma: #
# 1) Check dell'input dell'utente #
# 2) Chiamata della procedura di calcolo o visualizzazione #
# dei messaggi di errore #
#*************************************************
****************#

blt $t0,1,uno_q #Se q è < 1 , oppure non un numero salta all'etichetta uno_q
blt $t1,1,uno_n #Se n < 1 oppure non un numero salta all'etichetta uno_n
beq $t1,1,caso_speciale #Se n è == 1 salto all'etichetta caso_speciale

move $a0,$t0 #primo parametro della procedura exp ( base ) in $a0

addi $t2,$t0,1 #calcolo 1+q in $t2

sub $t9,$t1,0 #calcolo n-1 in $t9

j core #salto all'etichetta core

#---------------------------------------------------------------------------------------#
## core del programma ( il calcolo del risultato è iterativo ) ##
core:

addi $t4,$t4,1 # secondo parametro della procedura exp ( esponente )

move $a1,$t4 # metto il secondo parametro in $a1

li $a2,0 # terzo parametro della procedura exp , contatore i = 0 in $a2

li $v0,1 # risultato parziale della moltiplicazione inizializzato a 1

jal exp # chiamo exp

add $t5,$t5,$v1 # calcolo della somma dei valori elevati a potenza

add $t7,$t2,$t5 # aggiungo $t2( 1 + q ) alla somma dei valori elevati a potenza $t5( q^2 + q^3 + .... + q^n-1 ) in $t7

mul $t8,$t7,$t6 # moltiplico $t7 per $t6 in $t8

move $t6,$t8 # sposto $t8 in $t6 , ovvero memorizzo il valore della moltiplicazione precedente per poi riutilizzarlo nel ciclo

addi $t3,$t3,1 # incremento il contatore del ciclo ( + 1 )

blt $t3,$t9,core # se contatore < n-1 ciclo su core

j output # salto all'etichetta output
#---------------------------------------------------------------------------------------#


#---------------------------------------------------------------------------------------#
## procedura ricorsiva per il calcolo dei valori elevati a potenza ##
exp:

addi $sp, $sp, -12 # alloco stack per le variabili della procedura
sw $ra, 8($sp) # salvo return address
sw $a0, 4($sp) # salvo 1° parametro ( base )
sw $a1, 0($sp) # salvo 2° parametro ( esponente )

mul $v0, $v0, $a0 # moltiplico la base ( $a0 ) per il valore in $v0, e lo memorizzo in $v0
move $v1, $v0 # sposto il risultato in $v1

addi $a2, $a2, 1 # sommo 1 ad $a2 ( 3° parametro , contatore )e lo memorizzio in $a2

blt $a2, $a1, exp # controllo se $a2( contatore ) < uguale ad $a1 continuo il ciclo exp ( ricorsione )
# $a2 è il contatore del ciclo
j end # se non lo è esco dal ciclo e dalla procedura
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
## gestione della chiusura della procedura
end:
lw $ra, 8($sp) # carico return address dallo stack
lw $a0, 4($sp) # carico 1° parametro ( base ) dallo stack
lw $a1, 0($sp) # carico 2° parametro ( esponente ) dallo stack

addi $sp, $sp, 12 # dealloco stack

jr $ra # salto a return address
#---------------------------------------------------------------------------------------#


#---------------------------------------------------------------------------------------#
## gestione degli input non utilizzabili ##
uno_n:
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,err_n # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string
j main # Dopo il messaggio di errore ri-inizia il programma

uno_q:
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,err_q # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string
j main # Dopo il messaggio di errore ri-inizia il programma
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
## gestione caso in cui n == 1 ##
caso_speciale:

li $t8,1 #carcio il valore 1 in $t8 ( risultato )
j output #salto all'etichetta output
#---------------------------------------------------------------------------------------#


#---------------------------------------------------------------------------------------#
### stampa in output il risultato ###
output:

li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,text_q # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,1 # Codice di chiamata della system call per stampare a video una stringa
move $a0,$t0 # Memorizzazione della prima variabile q da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,text_n # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,1 # Codice di chiamata della system call per stampare a video una stringa
move $a0,$t1 # Memorizzazione della seconda variabile n da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,text_ris # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,1 # Codice di chiamata della system call per stampare a video una stringa
move $a0,$t8 # Memorizzazione del risultato da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

jal scelta
#---------------------------------------------------------------------------------------#


#---------------------------------------------------------------------------------------#
### Scelta da parte dell'utente se ripetere i programma o semplicemente uscire.###
### Vengono prima stampate a video le opzioni e poi letta la scelta dell'utente###

scelta:
li $v0, 4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,end1 # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0, 4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,end2 # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0, 4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,end3 # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0, 5 # Codice di chiamata della system call per leggere un'intero
syscall # Chiamata al sistema operativo per l'esecuzione della read int
move $t0, $v0 # Salvo il valore in $t0

beq $t0, 1, main # Se l'utente esegue la scelta 1 si ripete il programma
beq $t0, 2, exit # Se l'utente esegue la scelta 2 si termina programma
j scelta # Se la scelta è diversa da 1 o 2 viene riproposta la domanda.
#---------------------------------------------------------------------------------------#

#---------------------------------------------------------------------------------------#
## uscita dal programma ##
exit:
li $v0,4 # Codice di chiamata della system call per stampare a video una stringa
la $a0,text_bye # Memorizzazione dell'indirizzo della stringa da stampare nel registro a0
syscall # Chiamata al sistema operativo per l'esecuzione della print string

li $v0,10 # Codice di chiamata della system call per terminare l'esecuzione
syscall # Chiamata al sistema operativo per l'esecuzione della exit
#---------------------------------------------------------------------------------------#

## fine del programma ##


Posted by kernel1973 on 11-06-2008 21:24:

Angry

con questo codice nn ha valutato il progetto in maniera positiva perchè dice che non sono state rispettate le convenzioni per le chiamate a procedura e che i valori in output non sono corretti.
:evil:

Inoltre ha valutato la procedura exp non ricorsiva.:shock:


Posted by khelidan on 12-06-2008 11:41:

Ma non avevi confrontato i valori con i nostri sul thread el progetto?
Comunque ti allego il mio,ho preso 27,prova a vedere se ti ritrovi e se capisci cosa c'è di diverso nel tuo,comunque il prof ha ragione,exp non è ricorsiva,è iterativa con quel blt non richiami la procedura exp,semplicemente stai facendo un passo dell'iterazione

__________________
Khelidan


All times are GMT. The time now is 05:18.
Show all 3 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.