博客地址转至https://xisynotz.xyz
MIPS汇编实现冒泡排序
一、 实验目的
了解并学习使用mips汇编指令,掌握如何使用mips模拟器
二、 实验要求
基于MIPS汇编,设计一个冒泡排序程序,并用 Debug工具调试执行。测量冒泡排序程序的执行时间。
三、 实验环境
Mars simulator 4.5-win
四、 代码分析
.globl main
.text
# $t0: temp
# $t4: 循环变量i
# $t6: 循环变量j
# $t8: k
# $t5:数据长度
main:
li $v0, 5
syscall
add $t5, $zero, $v0 #读取记录数据长度
subi $t4, $t5, 1
addi $t8, $zero, 0
la $t1, sortarray
loop: #读取数据存放到sortarray处
li $v0 5
syscall
sw $v0, 0($t1)
addi $t0, $zero, 1
beq $t0,$t5,label #如果只有一个数字则不进行排序
addi $t8, $t8, 1
addi $t1, $t1, 4
sub $t7, $t5, $t8
bgtz $t7, loop
li $v0, 30
syscall
add $s1, $a0, $zero #$s1记录开始时间,这里不从人为输入开始计算,#避免人为因素影响,只测量主体程序执行时间
loop1:
la $t1, sortarray
addi $t6, $zero, 0 #j变量清零
loop2:
lw $t0, 0($t1) #t0 = array[j]
lw $t7, 4($t1) # array[j+1]
sub $t2, $t7, $t0
bgtz $t2, increment
sw $t7, 0($t1)
sw $t0, 4($t1)
increment:
addi $t6, $t6, 1 #j++
addi $t1, $t1, 4 #下一个地址
sub $t2, $t4, $t6 #t2 = i-j
bgtz $t2, loop2 #if j < i ,循环
addiu $t4, $t4, -1 #i--
lw $a0, 0($t1) #a0存放每次循环得到的次最大值
li $v0, 1 #输出$a0
syscall
la $a0, seprate
li $v0, 4 # 输出空格
syscall
bne $t4, $zero, loop1
label:
la $t1, sortarray #输出结束后剩余的那个最小值
lw $a0, 0($t1)
li $v0, 1
syscall
la $a0, seprate
li $v0, 4 # 输出空格
syscall
li $v0, 30 #读取结束时间
syscall
sub $a0 $a0,$s1
li $v0, 1
syscall #计算总用时并且输出
li $v0, 10 #halt
syscall
.data
sortarray:.space 40
seprate: .asciiz " "