本代码实现的是《计算机组成与设计:硬件/软件接口》第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