WinMIPS64实现冒泡排序

本代码实现的是《计算机组成与设计:硬件/软件接口》第94页的sort过程

相对于书本,本代码完善了数据准备,参数准备等细节, 把它变成了可执行的程序

.data
m1: .asciiz "before sort:"
m2: .asciiz "after sort:"
array: .word32 8,6,3,7,1,0,9,4,5,2

CONTROL: 		.word32 0x10000
DATA:       .word32 0x10008

.text
main:
lwu $t8,DATA($zero)
lwu $t9,CONTROL($zero)

daddi $sp,$zero,100
daddi $t1,$zero,m1			;输出字符串m1
sw $t1,0($t8)
daddi $t1,$zero,4
sw $t1,0($t9)

daddi $t1,$zero,array				;输出排序前的数组
daddi $t3,$zero,array
daddi $t3,$t3,32
lw $t4,0($t1)
sw $t4,0($t8)
daddi $t2,$zero,1
sw $t2,0($t9)
for:
daddi $t1,$t1,4
lw $t4,0($t1)
sw $t4,0($t8)
daddi $t2,$zero,1
sw $t2,0($t9)
bne $t1,$t3,for

daddi $a0,$zero,array		;为排序准备参数
daddi $a1,$zero,10

jal sort

output:
daddi $t1,$zero,m2			;输出字符串m2
sw $t1,0($t8)
daddi $t1,$zero,4
sw $t1,0($t9)

daddi $t1,$zero,array				;输出排序后的数组
daddi $t3,$zero,array
daddi $t3,$t3,36
lw $t4,0($t1)
sw $t4,0($t8)
daddi $t2,$zero,1
sw $t2,0($t9)
forr:
daddi $t1,$t1,4
lw $t4,0($t1)
sw $t4,0($t8)
daddi $t2,$zero,1
sw $t2,0($t9)
bne $t1,$t3,forr

halt

sort:
daddi $sp,$sp,-20			;将寄存器的值保存在栈
sw $ra,16($sp)
sw $s3,12($sp)
sw $s2,8($sp)
sw $s1,4($sp)
sw $s0,0($sp)

daddi $s2,$a0,0			;移动参数,a0存的是数组的地址,a1存的是需要排序的个数
daddi $s3,$a1,0

daddi $s0,$zero,0				;外部循环,s0代表i
for1tst:
slt $t0,$s0,$s3				;判断s0(即i)是否小于s3(n),如果小,则进如内部循环
beq $t0,$zero,exit1

daddi $s1,$s0,-1			;内部循环开始,寄存器s1存的是j,j=i-1
for2tst:
slti $t0,$s1,0				;如果j<0,跳出循环
bne $t0,$zero,exit2
dsll $t1,$s1,2					;计算出t1,t2即相对地址
dadd $t2,$s2,$t1
lw $t3,0($t2)					;利用t1,t2取对应的数
lw $t4,4($t2)
slt $t0,$t4,$t3				;如果数1大于数2,则跳出内部循环,不然则调用swap函数
beq $t0,$zero,exit2

daddi $a0,$s2,0				;传递参数并调用swap函数
daddi $a1,$s1,0
jal swap

daddi $s1,$s1,-1		;内部循环
j for2tst

exit2:
daddi $s0,$s0,1			;外部循环
j for1tst

exit1:
lw $s0,0($sp)
lw $s1,4($sp)
lw $s2,18($sp)
lw $s3,12($sp)
lw $ra,16($sp)
daddi $sp,$sp,20
jr $ra

swap:
dsll $t1,$a1,2				;取第k个数的相对地址
dadd $t1,$a0,$t1		;取第k个数的绝对地址
lw $t0,0($t1)
lw $t2,4($t1)
sw $t2,0($t1)
sw $t0,4($t1)
jr $ra

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值