|
kernel1973 |
.simpatizzante.
Registered: Oct 2007
Posts: 19 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 12:40:00: [...]
Status: Offline
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
|