MIPSでバブルソートのアルゴリズムを作りました。
シミュレータはQtSpimを使用。
やってみると意外と面白い
授業課題だったんですが、一応これで条件みたしているはず
パイプラインはまだ考慮できてないのでどうすればもっと効率的なのか、(もしいたら)わかる人是非コメントください。
本当は乱数を32個生成して、配列にぶち込むことからはじまるアルゴリズムを二週させればいいと思ってたんですけど、QtSpimだとsyscallの42番が使えないんですかね?とにかく使用できなかったので今は断念。
いやーなんだかうれしいですね
.data
myArray: .space 128
list: .word -2, 33, -5, 700, 1451, 133, 127, -19, 203, -29, 23, 40, -456, 21, -1, 111, 209, -4, 20, 47, -22, 10, 31, 100, 40, -23, 56, -556, 9000, 330, 0, 485
list2: .word 682, -52, -907, -37, -981, -132, -61, 787, 28, 647, 505, 747, 442, 125, 678, -803, -888, 29, 1, 10, 22, -22, 987, 334, 20, 110, 343, 8576, 245, 56, 99, 98
size: .word 32
afterArray: .space 128
space: .asciiz " "
newLine: .asciiz "\n"
declare: .asciiz "List : "
b_sort: .asciiz "Sorted List : "
minimun: .asciiz "Minimum Number : "
max: .asciiz "Max Number : "
.text
main:
# Index = $t0
# Counter = $s6
addi $t0, $zero, 0
add $s6, $s6, 1
init:
beq $s6, 2, init2 # jump to init2 second time
beq $s6, 3, end # Terminate Program if third time loop
beq $t0, 128, reset # loop if index =< 128
lw $s0, list($t0)
sw $s0, myArray($t0)
addi $t0, $t0, 4
j init
init2:
# loop if index =< 128
beq $t0, 128, reset
lw $s0, list2($t0)
sw $s0, myArray($t0)
addi $t0, $t0, 4
j init2
reset:
# clear index
addi $t0, $zero, 0
li $v0, 4
la $a0, newLine
syscall
li $v0, 4
la $a0, declare
syscall
print:
beq $t0, 128, neutral
# print current number
lw $t6, myArray($t0)
addi $t0, $t0, 4
li $v0, 1
move $a0, $t6
syscall
li $v0, 4
la $a0, space
syscall
j print
neutral:
addi $t0, $zero, 0
addi $t1, $zero, 0
bubble:
addi $t1, $t1, 4
beq $t1, 128, inc # change start line
beq $t0, 128, line_break # if finish
lw $t3, myArray($t0)
lw $t4, myArray($t1)
bgt $t3, $t4, swap # if left one is larger than right one, swap
j bubble
swap:
sw $t3, myArray($t1)
sw $t4, myArray($t0)
j bubble
inc:
# increment left edge
addi $t0, $t0, 4
addi $t1, $t0, 0
j bubble
line_break:
li $v0, 4
la $a0, newLine
syscall
addi $t0, $zero, 0
addi $t1, $zero, 0
minmax:
# print Minimum and Max number of List
addi $t0, $zero, 0
lw $t6, myArray($t0)
li $v0, 4
la $a0, minimun
syscall
li $v0, 1
move $a0, $t6
syscall
li $v0, 4
la $a0, newLine
syscall
addi $t0, $zero, 124
lw $t6, myArray($t0)
li $v0, 4
la $a0, max
syscall
li $v0, 1
move $a0, $t6
syscall
li $v0, 4
la $a0, newLine
syscall
li $v0, 4
la $a0, b_sort
syscall
addi $t0, $zero, 0
addi $t1, $zero, 0
while:
# Print sorted List(same algorithm as above print loop)
beq $t0, 128, main
lw $t6, myArray($t0)
addi $t0, $t0, 4
li $v0, 1
move $a0, $t6
syscall
li $v0, 4
la $a0, space
syscall
j while
end:
li $v0, 10
syscall