您好,欢迎访问三七文档
Spim冒泡排序.text.globlmain#$gp为数组基址寄存器#$s0为数组大小寄存器main:la$a0,str_1#系统调用提示用户输入数组大小li$v0,4syscallli$v0,5#系统调用把控制台中的数据读入寄存器syscallsll$t0,$v0,2#把个数乘4move$s0,$v0#把数组大小保存到s0la$a0,str_2#系统调用提示用户开始输入数据li$v0,4syscall#以下调用读入read函数move$a0,$gpmove$a1,$s0jalreadli$v0,4la$a0,str_5syscallmove$a0,$gpmove$a1,$s0jalprinf#以下调用排序函数move$a0,$gpmove$a1,$s0jalsortli$v0,4la$a0,str_3syscall#以下调用输出函数move$a0,$gpmove$a1,$s0jalprinf#询问是否要继续排序la$a0,str_4li$v0,4syscallli$v0,5syscallbeq$v0,$zero,mainli$v0,10syscall#以下为从控制台读数据的read函数部分read:addi$sp,$sp,-4#压栈sw$s0,0($sp)#把数组个数压入栈中li$s0,0#把s0寄存器置零read_1:sltu$t0,$s0,$a1#s0<a1则t0=1elsst0=0beq$t0,$zero,exit_1#t0=zero则跳转到exit_1sll$t0,$s0,2#s0左移两位add$t1,$a0,$t0#a0加上t0生成新地址move$t2,$a0#li$v0,5#系统调用syscallsw$v0,0($t1)#保存读入的数据到主存move$a0,$t2addi$s0,$s0,1#s0自加一jread_1exit_1:lw$s0,0($sp)#恢复s0中数据addi$sp,$sp,4#弹栈jr$ra#以下为排序函数部分sort:addi$sp,$sp,-20#在栈中开辟20个新地址sw$ra,16($sp)#返回址寄存器保存到栈中sw$s3,12($sp)#把s3保存到栈中sw$s2,8($sp)#把s2保存到栈中sw$s1,4($sp)#把s1保存到栈中sw$s0,0($sp)#把s0保存到栈中move$s2,$a0#把a0复制给s2move$s3,$a1#把a1复制给s3move$s0,$zero#把s0中的i值赋值为0for1tst:slt$t0,$s0,$s3#Ifi<n,thelengthofarr[],set$t0to1beq$t0,$zero,exit1#ift0=0则跳转到exit1addi$s1,$s0,-1#j=i-1for2tst:slti$t0,$s1,0#ifs1<0则t0=1bne$t0,$zero,exit2#t0等于1时跳转到exit2sll$t1,$s1,2#reg$tl=j*4add$t2,$s2,$t1#$t2storestheADRESSofarr[j]lw$t3,0($t2)#$t3storestheCONTENTofarr[j]lw$t4,4($t2)#$t4storestheCONTENTofarr[j+1]slt$t0,$t4,$t3#Ifarr[j+1]<arr[j],set$t0to1beq$t0,$zero,exit2#Ifarr[j+1]>arr[j],exitthisloopmove$a0,$s2#The1stparameterofswap#$s2storestheaddressofarr[]move$a1,$s1#The2ndparameterofswap#$s1storesjjalswap#Callswapaddi$s1,$s1,-1#j--jfor2tstexit2:addi$s0,$s0,1#i++jfor1tst#Jumptoouterloopexit1:lw$s0,0($sp)lw$s1,4($sp)lw$s2,8($sp)lw$s3,12($sp)lw$ra,16($sp)addi$sp,$sp,20jr$raswap:sll$t0,$a1,2#把a1中的k左移两位放到t1中add$t0,$a0,$t0#把a0中基址值加上偏移量4k得到V[k]的地址保存在t1中lw$t1,0($t0)#把V[k]的值放入t0中lw$t2,4($t0)#把v[k+1]的值放入t1中sw$t1,4($t0)#把v[k+1]保存在到v[k]的地址处使之成为v[k]sw$t2,0($t0)#把v[k]保存在到v[k+1]的地址处使之成为v[k+1]jr$ra#返回调用前的地址处#以下为输出函数prinf部分prinf:addi$sp,$sp,-4sw$s0,0($sp)#保存寄存器s0s1li$s0,0#将s0置零prinf_1:sltu$t0,$s0,$a1beq$t0,$zero,exit_2sll$t0,$s0,2add$t1,$a0,$t0move$t2,$a0lw$a0,0($t1)li$v0,1syscallli$a0,','li$v0,11syscallmove$a0,$t2addi$s0,$s0,1jprinf_1exit_2:lw$s0,0($sp)addi$sp,$sp,4jr$ra.datastr_1:.asciiz"欢迎您使用排序程序\n请输入要排序的数组的大小:\n"str_2:.asciiz"请输入要排序的数:\n"str_3:.asciiz"排序的结果为:\n"str_4:.asciiz"\n继续排序请输入0,退出输入1:\n"str_5:.asciiz"输入的数为:\n"
本文标题:Spim冒泡排序
链接地址:https://www.777doc.com/doc-5126612 .html