MIPSでバブルソート(Bubble Sort with MIPS)


[MIPS](https://ja.wikipedia.org/wiki/MIPS%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)で[バブルソート](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)のアルゴリズムを作りました。
シミュレータは[QtSpim](http://spimsimulator.sourceforge.net/)を使用。
やってみると意外と面白い

授業課題だったんですが、一応これで条件みたしているはず

[パイプライン](https://ja.wikipedia.org/wiki/%E5%91%BD%E4%BB%A4%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3)はまだ考慮できてないのでどうすればもっと効率的なのか、（もしいたら）わかる人是非コメントください。

本当は乱数を３２個生成して、配列にぶち込むことからはじまるアルゴリズムを二週させればいいと思ってたんですけど、QtSpimだとsyscallの４２番が使えないんですかね？とにかく使用できなかったので今は断念。
いやーなんだかうれしいですね

```MIPS

.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

```