View Single Post
Old 22-05-2009, 10:10   #1
Ethoel
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 28
[ASM - MIPS] Problemi con MCD e Matrice

Ciao a tutti ho un problema bello grosso....
Ho una matrice NxN e devo calcolare l'mcd tra gli indici della matrice (i e j) e fare in modo che l'elemento nella posizione (i,j) ci sia proprio l'mcd di i e j...

Ora:
stampare la matrice ordinata....[ok]
trovare le varie posizioni i,j.....[ok]
calcolare MCD...................[NON OK]

Mi dà problemi non mi stampa i vari mcd.... vi posto il codice:

Codice:
#$s0 -> dimensione matrice e poi dimensione matrice -1
#$s1 -> indirizzo della matrice
#$t0,$t1 ---> righe, colonne
#$t2 = N x N
#$t3 = contatore per la fine della matrice contata come array
#$t4 - $t5 = registri d'appoggio
#$t6 = registro per slt

.data
N: .word 6
Matrice: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
spazio: .asciiz " "
enter: .asciiz "\n"

.text
.globl main
main:
	la $s0,N      #carica indirizzo dimensione
	lw $s0,0($s0) #carica dimensione matrice

	la $s1,Matrice #carica indirizzo matrice

	move $t0,$zero #azzera contatore riga
	move $t1,$zero #azzera contatore colonna
	addi $t3,$zero,0 #controllo stampa

	addi $s2,$zero,1 #registo che memorizza 1 per verificare se la colonna o la riga è uguale a 1 (caso base)

	mul $t2,$s0,$s0 #moltiplica NxN per il controllo della fine della matrice
	addi $s0,$s0,-1 #decrementa la dimensione per contare da 0 a 5
ciclo:
	beq $t3,$t2,Fine

	move $t4,$t0            #$t4 <- riga
	move $t5,$t1            #$t5 <- colonna

	jal MCD                 #jal al calcolo dell'MCD

	lw $a0,0($s1)          #carica elemento matrice
 	li $v0,1               #stampa elemento matrice
	syscall

	beq $t1,$s0,Stampa_enter
	j Stampa_spazio

adiz:	
	addi $t3,$t3,1 #aumenta contatore stampa
	addi $s1,$s1,4 #indirizzo della matrice successiva
	j ciclo


Stampa_spazio:
	la $a0,spazio
	li $v0,4
	syscall
	addi $t1,$t1,1 #va alla colonna successiva
	j adiz

Stampa_enter:
	la $a0,enter
	li $v0,4
	syscall
	addi $t1,$zero,0 #azzera contatore colonna
	addi $t0,$t0,1 #va alla riga successiva
	j adiz

#funzione MCD

MCD:
	beq $t4,$zero,mcd_zero         #caso base
	beq $t5,$zero,mcd_zero         #caso base
	beq $t4,$t5,numeri_uguali      #caso base

	addi $sp,$sp,-4                 #crea spazio stack
	sw $ra,0($sp)			#salva indirizzo di ritorno

	slt $t6,$t4,$t5                 #controlla quale tra i e j è maggiore
	beq $t6,$zero,numero_maggiore
	
	j numero_minore

uscita_MCD:
	lw $ra,0($sp)                    #carica indirizzo di ritorno
	addi $sp,$sp,4                   #libera spazio stack
	jr $ra

mcd_zero:
	sw $zero,0($s1)                  #salva zero nella posizione corrente
	jr $ra

numeri_uguali:
	sw $t4,0($s1)     #salva nella matrice il numero
	jr $ra

numero_minore:
	sub $t5,$t5,$t4
	slt $t6,$t5,$zero
	beq $t6,$zero,salva_t4
	jal MCD
salva_t4:
	add $t5,$t5,$t4
	sw $t5,0($s1)
	j uscita_MCD
	
numero_maggiore:
	sub $t4,$t4,$t5
	slt $t6,$t4,$zero                
	beq $t6,$zero,salva_t5
	jal MCD
salva_t5:
	add $t4,$t4,$t5
	sw $t4,0($s1)
	j uscita_MCD

Fine:
	li $v0,10
        syscall
Mi ritorna una matrice di questo tipo:

0 0 0 0 0 0
0 1 2 3 4 5
0 2 2 3 4 5
0 3 3 3 4 5
0 4 4 4 4 5
0 5 5 5 5 5

E non penso proprio che sia quella giusta.....



Ragazzi vi prego aiutatemi stò impazzendo
Non so più dove mettere le mani....
Ethoel è offline   Rispondi citando il messaggio o parte di esso