|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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
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.... |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Apr 2008
Messaggi: 28
|
Sono un idiota... ho risolto...
Scusate la discussione inutile.... Potete chiudere |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:54.



















