Bubble Sort MIPS

感谢此文章的参考:http://blog.csdn.net/linwh8/article/details/68944058


第一次写MIPS就要写排序,不得不说这学期的计算机组成原理实验课有点艰辛,等下还要写完实验报告,有点困

MIPS的话主要分为几部分


.data部分

个人认为是一些前期准备,比如:给字符串中字符与某个变量关联起来、申请内存空间等

.text

.globl main部分

这是重点

代码基本就在这其中完成

话不多说来看看代码

##################################################
# #include<iostream>
# using namespace std;
# int main()
# {
# 	int num=5;
# 	int a[5];
# 	for(int i=0;i<num;i++)
# 	cin>>a[i];
# 	for(int i=0;i<num;i++)
# 	{
# 		for(int j=i;j>0;j--)
# 		{
# 			if(a[j]<a[j-1])
# 			{
# 				int temp=a[j];
# 				a[j]=a[j-1];
# 				a[j-1]=temp;
# 			}
# 		}
# 	}
# 	for(int i=num-1;i>=0;i--)
# 	cout<<a[i]<<" ";
# } 
##################################################

.text
.globl main
main:
  addi $v0,$zero,10   # $v0 数组长度设置为10
  la $t6,array        # $t6 是数组首地址
  move $t7,$zero      # $t7 是循环变量i
  move $t8,$v0        # $t8 是数组长度
  move $t9,$zero      # $t9 是循环变量j

input:
  li $v0,5            # 读取用户输入的数字
  syscall

  move $t0,$t7        # $t0取i
  sll $t0,$t0,2       # $t0变为其字节地址
  addu $t1,$t0,$t6    # $t0变为数组中字节地址
  sw $v0,0($t1)       # 把用户输入的数字保存到$t0中

  addi $t7,$t7,1      # 数组+1
  blt $t7,$t8,input   # 比较当前数组序号与数组长度,如果还未填满数组,则跳转到input再进行输入
  move $t7,$zero      # 若已经填满数组,则结束输入模块,$t7置0方便下次使用

loop1:
  move $t9,$t7        #循环的j重置为i

loop2:
  move $t0,$t9        #$t0取j
  sll $t0,$t0,2       #$t0变为其字节地址
  addu $t0,$t0,$t6    #$t0变为数组中字节地址
  lw $t1,0($t0)       #$t1获取$t0中元素

  addi $t3,$t0,-4     #$t0取数组中j-1的字节地址
  lw $t2,0($t3)       #$t2获取$t0中元素

  bge $t1,$t2,skip    #若$t2小于$t1,则跳转到skip
  sw $t2,0($t0)       #若$t2大于$t1,则两者进行交换,交换后再跳转到skip
  sw $t1,0($t3)

skip:
  addi $t9,$t9,-1     #j-1
  blt $zero,$t9,loop2 #如果j大于0,则跳转到loop2
  addi $t7,$t7,1      #如果j小于0,则i+1后跳转到loop1
  blt $t7,$t8,loop1

middo:
  addi $t8,$t8,-1
  move $t7,$t8        #中途处理,$t7(i)置为$t8-1
  addi $t2,$zero,-1
print:
  move $t0,$t7        #$t0获取$t7中元素
  sll $t0,$t0,2       #$t0变为其字节地址
  addu $t0,$t0,$t6    #$t0变为数组中字节地址
  lw $a0,0($t0)       #$a0获取$t0中元素
  li $v0,1            #打印$a0
  syscall

  la $a0,separate     #打印空格符号
  li $v0,4
  syscall
  
  addi $t7,$t7,-1     #i--
  blt $t2,$t7,print   #如果i大于等于0,则继续执行print

.data
array:.space 400      #申请400字节内存
separate:.asciiz" "   #把separate变量与空格关联起来

其中第一次发生了错误

真是令人窒息

debug全靠猜

后来发现了第一次代码中


更改为


程序即可正常运行( ̄_ ̄|||)

我内心里一顿无奈

浪费了很多时间

这样看来MIPS两个sw是并行的?所以产生了错误?

这个真没弄懂

明早上课问问老师

第一次写MIPS就这样愉快的结束了(写一上午写了个bug一点也不愉快= =)

猜你喜欢

转载自blog.csdn.net/qq_39380075/article/details/78248540
今日推荐