PDA

View Full Version : Bubble Sorte in MIPS


xbubbax
15-04-2007, 09:17
Qualcuno mi aiuta a modificare questo bubble sort in MIPS in modo da funzionare per un vettore di 6 elementi e per far si che stampi il vettore ordinato.

.text
.globl main

main:

li $a0,10 #parameter n
sll $a0,$a0,2 #number of bytes in array A

outer:

sub $t0,$a0,8 #$t0: j-1
li $t1,0 #no swap yet

inner:

lw $t2,A+4($t0) #$t2<--A[j]
lw $t3,A($t0) #$t3<--A[j-1]
bgt $t2,$t3,no_swap #A[j]<=A[j-1]?

sw $t2,A($t0) #A[j-1]<--$t2 \move bubble
sw $t3,A+4($t0) #A[j]<--$t3 /$t2 upwards
li $t1,1 #swap occurred

no_swap:

sub $t0,$t0,4 #next array element
bgez $t0,inner #more?

bnez $t1,outer #did we swap?

li $v0,10 #exit
syscall

.data

A: .word: 4,6,5,8,2,3,5,1,7,9

luka987
15-04-2007, 12:04
mips l'ho fatto in architettura dei processori come esame all'uni...ma onestamente non sono così freschi i ricordi
ma non basta che modifichi la seguente riga:

li $a0,10 #parameter n

se vuoi un vettore di sei elementi fai:

li $a0,6

ho guardato il programma molto al volo ma $a0 dovrebbe fungere da contatore della lunghezza del vettore. Infatti a ogni ciclo lo decrementa:
sub $t0,$a0,8 #$t0: j-1

spero di non aver detto boiate

Kuntz87
15-04-2007, 12:07
se magari potresti provarlo e dirmi se funziona mi faresti un enorme piacere

così magari vedi l'errore che da

Kuntz87
15-04-2007, 12:20
in pratica il programma dovrà fare questo

Il programma dovrà

definire un'area di memoria array che conterrà un vettore numerico generico
un'area di memoria array che conterrà il vettore ordinato
(opzionale: stampa a video del vettore ordinato)

Kuntz87
15-04-2007, 12:40
comq xbubbax e kuntz87 sono sempre io

recoil
16-04-2007, 23:18
.data

A: .byte 4,6,5,8,1,3,10,2,7,9


.text
.globl main

main:

li $s0,10 #parameter n
li $t0,0 # $t0 fa da contatore per il ciclo outer
la $a1,A # in $a1 indirizzo dell'array

outer:

li $t1, 0 #$t1 contatore ciclo interno
li $t5, 0 #$t5 per vedere se c'è stato swap

inner:

add $t4,$a1,$t0 # in $t4 indirizzo A[i]
lb $t2,0($t4) # $t2<--A[i]
add $t4,$a1,$t1 # in $t4 indirizzo A[j]
lb $t3,0($t4) #$t3<--A[j]
bgt $t2,$t3,no_swap #A[i]>A[j]?

sb $t2,0($t4) #A[j]<--$t2 \move bubble
add $t4,$a1,$t0
sb $t3,0($t4) #A[i]<--$t3 /$t2 upwards
li $t5,1

no_swap:

addi $t1,$t1,1 # j = j + 1
bne $t1,$s0,inner # j = 10?

beqz $t5,endsort # niente swap, si puo' uscire

addi $t0,$t0,1 # i = i + 1
bne $t0,$s0,outer # i = 10?

endsort:

li $t0,0 # contatore per stampa numeri

print:

add $t4,$a1,$t0
lb $a0,0($t4)
li $v0,1
syscall
addi $t0,$t0,1
bne $t0,$s0,print

li $v0,10 #exit
syscall



ho usato byte perché con la direttiva word spim dava errore, non ricordo come si carica una word e il mio collegamento a internet penoso non mi contente di verificare come si fa :rolleyes:
ricordo anche io la parola chiave word, chissà come mai non va...