PDA

View Full Version : [MIPS] Aiuto nel realizzare un programma


Tioz90
23-11-2012, 18:12
Ciao ragazzi, vi posto il codice C che ho scritto come guida per aiutarmi a realizzare lo stesso programma in Assembly MIPS.

In pratica voglio fare in modo che l'utente possa inserire un numero N e che venga creata una matrice di dimensione (N,N), che successivamente gli venga richiesto che valore inserire in ogni cella della matrice e infine che venga visualizzato il determinante.

In C funziona perfettamente ma sto avendo problemi a capire come allocare runtime la memoria per memorizzare l'array in Assembly.
Grazie mille a chi ha voglia di darci un'occhiata :fagiano:

#include <stdio.h>

void matrix(int d);
int determinante(int dim,int matrix[dim][dim]);
int indice(int ind);

int main(void)
{
int d; //dimensione matrice
printf("Dimensione matrice?: ");
scanf("%d",&d); //memorizza la dimensione in d
matrix(d); //chiama la funz matrix
system("pause");
return 0;
}

void matrix(int dim) //funz matrix
{
int i,j;
int m[dim][dim]; //crea matrice d*d (dim*dim)

//creazione matrice
printf("Inserire gli elementi della matrice %dx%d :\n",dim,dim); //inserisce i dati nella matrice uno per uno
for(i=0;i<dim;++i) //scorre la linea
{
for(j=0;j<dim;++j) //scorre la colonna
{
printf("Inserire l'elemento della posizione (%d,%d): ", i+1,j+1);
scanf("%d",&m[i][j]); //inserisce il dato nella matrice
}
}

printf("\n\nMatrice creata:\n\n");

for(i=0;i<dim;++i) //scorre la linea
{
for(j=0;j<dim;++j) //scorre la colonna
{
printf("%d\t", m[i][j]);
}
printf("\n");
}


//stampa determinante
printf("\n\nIl determinante della matrice e': %d\n",determinante(dim,m));
}

int determinante(int dim,int matrix[dim][dim])
{
int i,j,k;
int D=0;

//se la matrice e' una 1x1
if(dim==1)
D=matrix[0][0];


for(i=0;i<dim&&dim>1;++i) //scorre righe
{
int mattemp[dim-1][dim-1]; //crea una matrice delle stesse dimensioni di prima (dim-1 perchè se creo una matrice d=3 se comincio a contare da i=0 ne creerebbe una 4x4)
for(j=0;j<dim;++j) //scorre colonne
{
for(k=1;k<dim&&j!=i;++k) //controllo sugli indici, controlla se il contatore è minore della dimensione della matrice e controlla che non sia sulla diagonale
{
if(j<i) //se l'indice j delle colonne è minore dell'indice i delle righe mette nella matrice temporanea mattemp il valore che si torva in quella posizione
mattemp[j][k-1]=matrix[j][k];
if(j>i)
mattemp[j-1][k-1]=matrix[j][k];
}
}
D=D+indice(i)/*passa i alla funz indice che ritorna 1,-1*/*matrix[i][0]/*considera una matrice di un elemento*/*determinante(dim-1,mattemp)/*passa alla funz determinante la dimensione della sottomatrice e la matrice stessa e ne restituisce il determinante*/
; //calcola il determinante
}
return D;
}
//indice 1,-1 a seconda della posizione considerata
int indice(int ind) //funzione indice
{
if(ind%2==0)
return 1; //controlla se la divisione tra indice colonna e indice riga è pari o dispari
else
return -1;
}

Tioz90
23-11-2012, 20:11
Credo di esserci riuscito :)
Posto qui per referenza futura

######## Questa sezione legge i dati da mettere nella cella della matrice ########

move $s1,$s0
li $t1,0
forriga: #ciclo for per visualizzare l'indice di riga
li $t2,0
forcolonna: #ciclo for per visualizzare l'indice di colonna
li $v0,4 #stampa messaggio inserisci
la $a0,inserisci
syscall
li $v0,1 #stampa l'indice di riga
move $a0,$t1
syscall
li $v0,4 #stampa separatore
la $a0,virgola
syscall
li $v0,1 #stampa l'indice di colonna
move $a0,$t2
syscall
li $v0,4 #stampa la parentesi di chiusura
la $a0,parentesi
syscall

li $v0,5 #legge il dato da mettere nella cella
syscall
sw $v0,0($s0) #salva il dato letto nell'array
addi $s0,4 #punta al prossimo elemento dell'array

li $v0,4 #va a capo
la $a0,capo
syscall

addi $t2,1 #incrementa il contatore di colonna
blt $t2,$t0,forcolonna #controllo del for interno (colonna)
addi $t1,1 #incrementa il contatore di riga
blt $t1,$t0,forriga #controllo del for esterno (riga)

##################################################################################