Bubble Sort MIPS

来源:互联网 发布:mac抹掉磁盘 编辑:程序博客网 时间:2024/06/05 16:07

感谢此文章的参考: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 mainmain:  addi $v0,$zero,10   # $v0 数组长度设置为10  la $t6,array        # $t6 是数组首地址  move $t7,$zero      # $t7 是循环变量i  move $t8,$v0        # $t8 是数组长度  move $t9,$zero      # $t9 是循环变量jinput:  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重置为iloop2:  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,loop1middo:  addi $t8,$t8,-1  move $t7,$t8        #中途处理,$t7(i)置为$t8-1  addi $t2,$zero,-1print:  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.dataarray:.space 400      #申请400字节内存separate:.asciiz" "   #把separate变量与空格关联起来

其中第一次发生了错误

真是令人窒息

debug全靠猜

后来发现了第一次代码中


更改为


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

我内心里一顿无奈

浪费了很多时间

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

这个真没弄懂

明早上课问问老师

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

原创粉丝点击