Dsy Network www | forum | my | didattica | howto | wiki | el goog | stats | blog | dona | rappresentanti
Homepage
 Register   Calendar   Members  Faq   Search  Logout 
.dsy:it. : Powered by vBulletin version 2.3.1 .dsy:it. > Didattica > Corsi A - F > Architettura degli elaboratori e delle reti > Filez > q-fattoriale
  Last Thread   Next Thread
Author
Thread    Expand all | Contract all    Post New Thread    Post A Reply
Collapse
kernel1973
.simpatizzante.

User info:
Registered: Oct 2007
Posts: 19 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 12:40:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
[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 ##

Last edited by kernel1973 on 03-06-2008 at 22:03

03-06-2008 21:05
Click Here to See the Profile for kernel1973 Click here to Send kernel1973 a Private Message Find more posts by kernel1973 Add kernel1973 to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
kernel1973
.simpatizzante.

User info:
Registered: Oct 2007
Posts: 19 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 12:40:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
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:

11-06-2008 21:24
Click Here to See the Profile for kernel1973 Click here to Send kernel1973 a Private Message Find more posts by kernel1973 Add kernel1973 to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
khelidan
.grande:maestro.

User info:
Registered: Jun 2003
Posts: 1196 (0.15 al dì)
Location: Milano
Corso: Informatica
Anno: Finito....
Time Online: 13 Days, 12:08:03: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

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

Attachment: qfattoriale.s.zip
This has been downloaded 87 time(s).

__________________
Khelidan

Last edited by khelidan on 12-06-2008 at 11:47

12-06-2008 11:41
Click Here to See the Profile for khelidan Click here to Send khelidan a Private Message Find more posts by khelidan Add khelidan to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
All times are GMT. The time now is 20:00.    Post New Thread    Post A Reply
  Last Thread   Next Thread
Show Printable Version | Email this Page | Subscribe to this Thread | Add to Bookmarks

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
 

Powered by: 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
Pagina generata in 0.180 seconds (78.38% PHP - 21.62% MySQL) con 26 query.