LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-06

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0