Aiuto URGENTISSIMO programmazione MIPS
Inviato: domenica 1 novembre 2009, 21:23
Ciao a tutti!!! 
Ho bisogno di un'occhiata a questo progetto che devo consegnare domani ma che non mi funziona :'(
Teoricamente il programma dovrebbe calcolare le funzioni seno, coseno e tangente da input...
Vi prego aiutatemiiiiii urgentemente >:(
Di seguito potete trovare il codice .s del programma:
.data
#visualizzazione intestazione
Int1: .asciiz"\n PROGETTO DI ARCHITETTURA DEGLI ELABORATORI\n"
Int2: .asciiz"\n ------------------Benvenuto--------------------\n"
Int3: .asciiz"\n Con questo programma e' possibile calcolare tre funzioni trigonometriche: "
Int4: .asciiz"\n seno,coseno e tangente. Attraverso un menu' di scelta, sara' possibile"
Int5: .asciiz"\n scegliere quale funzione applicare al numero da inserire come input\n"
Int6: .asciiz" \n Buon divertimento!\n"
#stringhe per programma
InsNum: .asciiz"\nInserisci un numero: "
Menu: .asciiz"\n0.Seno\n1.Coseno\n2.Tangente\n"
Err: .asciiz"\nAttenzione: scelta non valida!\n"
Exit: .asciiz"\nDesideri riavviare il programma(y/n):\n"
Bye: .asciiz "\n\nGrazie e arrivederci!"
RSen: .asciiz"\nIl seno e'= "
RCos: .asciiz"\nIl coseno e'= "
RTan: .asciiz"\nLa tangente e'= "
JTable: .word Sen,Cos,Tan
.text
.globl main
#menu' principale
main:
#dichiarazione variabili
add $t1,$0,$0 #scelta
add $s0,$0,$0 #x
add $s1,$0,$0 #n
add $s2,$0,$0 #conf
#stampo tutte le intestazioni con presentazione
la $a0,Int1
addi $v0,$0,4
syscall
la $a0,Int2
addi $v0,$0,4
syscall
la $a0,Int3
addi $v0,$0,4
syscall
la $a0,Int4
addi $v0,$0,4
syscall
la $a0,Int5
addi $v0,$0,4
syscall
la $a0,Int6
addi $v0,$0,4
syscall
#stampo menu'
la $a0,Menu
addi $v0,$0,4
syscall
#Ottengo la scelta
add $t0,$0,$v0
addi $v0,$0,5
syscall
#salto all'operazione da esegiure
sll $t0,$t0,2
lw $t1,JTable($t0)
jr $t1
#Controllo la scelta
bge $t0,3,Errore
blt $t0,0,Errore
#Comunico la scelta non valida all'utente
Errore:
la $a0,Err
addi $v0,$0,4
syscall
j Again #esce dal programma
#richiami di procedure
#procedura per il seno del numero inserito da input
Sen:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Seno
j Again
#procedure per il coseno da input
Cos:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Coseno
j Again
#procedura per tangente
Tan:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Tangente
#richiedo eventuale riesecuzione del programma
#stampo il prompt che richiede la scelta
Again:
la $a0,Exit
addi $v0,$0,4
syscall
#leggo la scelta dell'utente.
addi $v0,$0,5
syscall
beq $v0,'y',main
beq $v0,'Y',main
beq $v0,'n',Uscita
beq $v0,'N',Uscita
Uscita:
li $v0,4
la $a0,Bye
syscall
li $v0, 10
syscall
#####################################
# PROCEDURE
#####################################
#calcolo fattoriale
Fattor:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#variabili necessarie
addi $v0,$0,1 #i=1
addi $s0,$0,1 #Fatt=1
ForFatt:
bgt $v0,$a1,EndForFatt #se i>n salta a EndForFatt
mul $s0,$s0,$v0 #Fatt=Fatt*i
addi $v0,$v0,1 #i++
j ForFatt
EndForFatt:
addi $s0,$s0,0 #restituisco Fatt
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
###############################
#calcolo esponenziale
Espon:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri x e n
add $s5,$0,$a0 #n
add $s6,$0,$a1 #x
#variabili
add $s0,$0,$0 #c=0
addi $s1,$s3,1 #baseTot=1
addi $t2,$t2,-1 #t2=-1
addi $t3,$t3,1 #t3=1
#if(n==0)
If1:
bne $s6,0,If2 #n=!0 salta a if2
addi $s5,$s5,1
j For2
If2:
bge $s5,$0,For2
mul $s5,$s6,$t2 #n=n*-1
div $s6,$t3,$s6 #x=1/x
mul $s1,$s6,$t3 #baseTot=x*1
For1:
bge $s0,$s5,For2
mul $s1,$s1,$s6 #basetot=basetot*x
addi $s0,$s0,1 #c++
j For1
For2:
bge $s0,$s5,EndEsp
mul $s1,$s1,$s6 #basetot=basetot*x
addi $s0,$s0,1 #c++
j For2
EndEsp:
addi $s1,$s1,0 #restituisco basetot sommando 0
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
##############################################
#calcolo Seno di x
Seno:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
add $s5,$0,$a0 #n
#variabili
add $s4,$0,$0 #seno=0
add $s7,$0,$0 #a=0 per esponenziale(x,2*n+1)
add $s2,$0,$0 #b=0 per fattoriale(2*n+1)
add $s3,$0,$0 #c=0 per esponenziale(-1,n)
addi $t2,$t2,2 #t2=2
ForSeno:
bgt $s5,30,EndForSeno
mul $s5,$s5,$t2 #n=2*n
addi $s5,$s5,1 #n=2*n+1
jal Espon
add $s7,$s1,$0 #a=basetot ovvero esponenziale(x,2*n+1)
mul $s5,$s5,$t2 #n=2*n
addi $s5,$s5,1 #n=2*n+1
jal Fattor
add $s2,$s0,$0 #b=fatt(2*n+1)
lb $s6,-1 #x=-1
add $s5,$0,$a0
jal Espon
add $s3,$s1,$0 #c=basetot ovvero esponenziale(-1,n)
div $t0,$s7,$s2 #t0=esp/fatt
mul $t1,$t0,$s2 #t1=t0*fatt
add $s4,$s4,$t1 #seno=seno+t1
addi $s5,$s5,1 #n++
j ForSeno #rieseguo il ciclo finchè la condizione è vera
EndForSeno:
addi $s4,$s4,0 #restituisco seno sommando 0
la $a0,RSen
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
####################################
#calcolo Coseno di x
Coseno:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
add $s5,$0,$a0 #n
#variabili
add $s4,$0,$0 #coseno=0
add $s7,$0,$0 #a=0 per esponenziale(x,2*n)
add $s2,$0,$0 #b=0 per fattoriale(2*n)
add $s3,$0,$0 #c=0 per esponenziale(-1,n)
addi $t2,$t2,2 #t2=2
ForCoseno:
bgt $s5,30,EndForCoseno
mul $s5,$s5,$t2 #n=2*n
jal Espon
add $s7,$s1,$0 #a=basetot ovvero esponenziale(x,2*n)
mul $s5,$s5,$t2 #n=2*n
jal Fattor
add $s2,$s0,$0 #b=fatt(2*n)
lb $s6,-1 #x=-1
add $s5,$0,$a0
jal Espon
add $s3,$s1,$0 #c=basetot ovvero esponenziale(-1,n)
div $t0,$s7,$s2 #t0=esp/fatt
mul $t1,$t0,$s2 #t1=t0*fatt
add $s4,$s4,$t1 #seno=seno+t1
addi $s5,$s5,1 #n++
j ForCoseno #rieseguo il ciclo finchè la condizione è vera
EndForCoseno:
addi $s4,$s4,0 #restituisco coseno sommando 0
la $a0,RCos
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
####################################
#calcolo Tangente di x
Tangente:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
#variabili
add $s4,$0,$0 #tan=0
#calcolo tangente
add $t0,$0,$0 #definisco t0 per calcolo seno
jal Seno
add $t1,$0,$0 #definisco t1 calcolo coseno
jal Coseno
div $s4,$t0,$t1 #tan=t0/t1
addi $s4,$s4,0 #restituisco tan sommando 0
la $a0,RTan
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16 #dealloco 4 word
jr $ra
Ho bisogno di un'occhiata a questo progetto che devo consegnare domani ma che non mi funziona :'(
Teoricamente il programma dovrebbe calcolare le funzioni seno, coseno e tangente da input...
Vi prego aiutatemiiiiii urgentemente >:(
Di seguito potete trovare il codice .s del programma:
.data
#visualizzazione intestazione
Int1: .asciiz"\n PROGETTO DI ARCHITETTURA DEGLI ELABORATORI\n"
Int2: .asciiz"\n ------------------Benvenuto--------------------\n"
Int3: .asciiz"\n Con questo programma e' possibile calcolare tre funzioni trigonometriche: "
Int4: .asciiz"\n seno,coseno e tangente. Attraverso un menu' di scelta, sara' possibile"
Int5: .asciiz"\n scegliere quale funzione applicare al numero da inserire come input\n"
Int6: .asciiz" \n Buon divertimento!\n"
#stringhe per programma
InsNum: .asciiz"\nInserisci un numero: "
Menu: .asciiz"\n0.Seno\n1.Coseno\n2.Tangente\n"
Err: .asciiz"\nAttenzione: scelta non valida!\n"
Exit: .asciiz"\nDesideri riavviare il programma(y/n):\n"
Bye: .asciiz "\n\nGrazie e arrivederci!"
RSen: .asciiz"\nIl seno e'= "
RCos: .asciiz"\nIl coseno e'= "
RTan: .asciiz"\nLa tangente e'= "
JTable: .word Sen,Cos,Tan
.text
.globl main
#menu' principale
main:
#dichiarazione variabili
add $t1,$0,$0 #scelta
add $s0,$0,$0 #x
add $s1,$0,$0 #n
add $s2,$0,$0 #conf
#stampo tutte le intestazioni con presentazione
la $a0,Int1
addi $v0,$0,4
syscall
la $a0,Int2
addi $v0,$0,4
syscall
la $a0,Int3
addi $v0,$0,4
syscall
la $a0,Int4
addi $v0,$0,4
syscall
la $a0,Int5
addi $v0,$0,4
syscall
la $a0,Int6
addi $v0,$0,4
syscall
#stampo menu'
la $a0,Menu
addi $v0,$0,4
syscall
#Ottengo la scelta
add $t0,$0,$v0
addi $v0,$0,5
syscall
#salto all'operazione da esegiure
sll $t0,$t0,2
lw $t1,JTable($t0)
jr $t1
#Controllo la scelta
bge $t0,3,Errore
blt $t0,0,Errore
#Comunico la scelta non valida all'utente
Errore:
la $a0,Err
addi $v0,$0,4
syscall
j Again #esce dal programma
#richiami di procedure
#procedura per il seno del numero inserito da input
Sen:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Seno
j Again
#procedure per il coseno da input
Cos:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Coseno
j Again
#procedura per tangente
Tan:
add $s0,$s0,$0 #input x=0
la $a1,InsNum #inserisci numero
jal Tangente
#richiedo eventuale riesecuzione del programma
#stampo il prompt che richiede la scelta
Again:
la $a0,Exit
addi $v0,$0,4
syscall
#leggo la scelta dell'utente.
addi $v0,$0,5
syscall
beq $v0,'y',main
beq $v0,'Y',main
beq $v0,'n',Uscita
beq $v0,'N',Uscita
Uscita:
li $v0,4
la $a0,Bye
syscall
li $v0, 10
syscall
#####################################
# PROCEDURE
#####################################
#calcolo fattoriale
Fattor:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#variabili necessarie
addi $v0,$0,1 #i=1
addi $s0,$0,1 #Fatt=1
ForFatt:
bgt $v0,$a1,EndForFatt #se i>n salta a EndForFatt
mul $s0,$s0,$v0 #Fatt=Fatt*i
addi $v0,$v0,1 #i++
j ForFatt
EndForFatt:
addi $s0,$s0,0 #restituisco Fatt
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
###############################
#calcolo esponenziale
Espon:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri x e n
add $s5,$0,$a0 #n
add $s6,$0,$a1 #x
#variabili
add $s0,$0,$0 #c=0
addi $s1,$s3,1 #baseTot=1
addi $t2,$t2,-1 #t2=-1
addi $t3,$t3,1 #t3=1
#if(n==0)
If1:
bne $s6,0,If2 #n=!0 salta a if2
addi $s5,$s5,1
j For2
If2:
bge $s5,$0,For2
mul $s5,$s6,$t2 #n=n*-1
div $s6,$t3,$s6 #x=1/x
mul $s1,$s6,$t3 #baseTot=x*1
For1:
bge $s0,$s5,For2
mul $s1,$s1,$s6 #basetot=basetot*x
addi $s0,$s0,1 #c++
j For1
For2:
bge $s0,$s5,EndEsp
mul $s1,$s1,$s6 #basetot=basetot*x
addi $s0,$s0,1 #c++
j For2
EndEsp:
addi $s1,$s1,0 #restituisco basetot sommando 0
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
##############################################
#calcolo Seno di x
Seno:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
add $s5,$0,$a0 #n
#variabili
add $s4,$0,$0 #seno=0
add $s7,$0,$0 #a=0 per esponenziale(x,2*n+1)
add $s2,$0,$0 #b=0 per fattoriale(2*n+1)
add $s3,$0,$0 #c=0 per esponenziale(-1,n)
addi $t2,$t2,2 #t2=2
ForSeno:
bgt $s5,30,EndForSeno
mul $s5,$s5,$t2 #n=2*n
addi $s5,$s5,1 #n=2*n+1
jal Espon
add $s7,$s1,$0 #a=basetot ovvero esponenziale(x,2*n+1)
mul $s5,$s5,$t2 #n=2*n
addi $s5,$s5,1 #n=2*n+1
jal Fattor
add $s2,$s0,$0 #b=fatt(2*n+1)
lb $s6,-1 #x=-1
add $s5,$0,$a0
jal Espon
add $s3,$s1,$0 #c=basetot ovvero esponenziale(-1,n)
div $t0,$s7,$s2 #t0=esp/fatt
mul $t1,$t0,$s2 #t1=t0*fatt
add $s4,$s4,$t1 #seno=seno+t1
addi $s5,$s5,1 #n++
j ForSeno #rieseguo il ciclo finchè la condizione è vera
EndForSeno:
addi $s4,$s4,0 #restituisco seno sommando 0
la $a0,RSen
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
####################################
#calcolo Coseno di x
Coseno:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
add $s5,$0,$a0 #n
#variabili
add $s4,$0,$0 #coseno=0
add $s7,$0,$0 #a=0 per esponenziale(x,2*n)
add $s2,$0,$0 #b=0 per fattoriale(2*n)
add $s3,$0,$0 #c=0 per esponenziale(-1,n)
addi $t2,$t2,2 #t2=2
ForCoseno:
bgt $s5,30,EndForCoseno
mul $s5,$s5,$t2 #n=2*n
jal Espon
add $s7,$s1,$0 #a=basetot ovvero esponenziale(x,2*n)
mul $s5,$s5,$t2 #n=2*n
jal Fattor
add $s2,$s0,$0 #b=fatt(2*n)
lb $s6,-1 #x=-1
add $s5,$0,$a0
jal Espon
add $s3,$s1,$0 #c=basetot ovvero esponenziale(-1,n)
div $t0,$s7,$s2 #t0=esp/fatt
mul $t1,$t0,$s2 #t1=t0*fatt
add $s4,$s4,$t1 #seno=seno+t1
addi $s5,$s5,1 #n++
j ForCoseno #rieseguo il ciclo finchè la condizione è vera
EndForCoseno:
addi $s4,$s4,0 #restituisco coseno sommando 0
la $a0,RCos
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16#dealloco 4 word
jr $ra
####################################
#calcolo Tangente di x
Tangente:
#Salvo i registri
addi $sp,$sp,-16 #alloco 4 word
sw $s0,12($sp)
sw $s1,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
#parametri
add $s6,$0,$a1 #x
#variabili
add $s4,$0,$0 #tan=0
#calcolo tangente
add $t0,$0,$0 #definisco t0 per calcolo seno
jal Seno
add $t1,$0,$0 #definisco t1 calcolo coseno
jal Coseno
div $s4,$t0,$t1 #tan=t0/t1
addi $s4,$s4,0 #restituisco tan sommando 0
la $a0,RTan
addi $v0,$0,4
syscall
#Ripristino i registri.
lw $s3,0($sp)
lw $s2,4($sp)
lw $s1,8($sp)
lw $s0,12($sp)
add $sp,$sp,16 #dealloco 4 word
jr $ra