6,125
社区成员
发帖
与我相关
我的任务
分享
.text
.globl main
main:
la $t6,array # 将数组地址其实地址放到 t6位置上
move $t7 $zero # 用于计数 控制输入
addi $t8 $zero 10
j input
input:
la $a0 input_msg # 将输入信息放到a0 这个寄存器上
li $v0 4 # 将命令符寄存器中放入立即数4 用于字符输出
syscall # 输入提示符的输入完成
li $v0 5 # 调用了输入命令 5 装载到$v0上
syscall # 系统调用 输入的数被放到了v0上
move $t0 $t7 # 将临时的计数寄存器中的内容放到临时寄存器t0上
mul $t0 $t0 4 # 得到了在该点的地址偏移值
add $t0 $t0 $t6 # 将数组地址加上了偏移量t0,得到当前地址
sw $v0 0($t0) # 将$vo中的数放到t0对应的地址中
addi $t7 $t7 1 # 对计数的$t7进行加一操作
blt $t7 $t8 input # 如果不相等,就循环该进程
# 开始排序了--- 采用 简单排序方式
move $t7 $zero # 计数初始化,作为外层的遍历下标
sort1:
addi $t5 $t7 1
slt $t0 $t7 $t8
beq $t0 $zero output # 经过确认了,一定会到达第二层
sort2:
# sort2表示排序从t7 + 1开始到结尾的部分和t7比较大小(t7用于外层计数 t5用于内层计数)
# 先将两个数给拉下来放到$a1 $a2 两个 register上
# 用t3 t4 做地址运算同时存储了那两个东西的地址
mul $t3 $t7 4
add $t3 $t3 $t6 # 得到了外层的那个数的地址
lw $a1 0($t3) # 得到了外层那个数值
mul $t4 $t5 4
add $t4 $t4 $t6 # 得到了内层的那个数的地址
lw $a2 0($t4) # 得到了内层那个数值
slt $t0 $a1 $a2 # 如果内层那个数大于等于外层那个数 t0就会是0
beq $t0 $zero swap # 就要进行交换
sort3:
addi $t5 $t5 1 # 内层计数加一
slt $t0 $t5 $t8
bne $t0 $zero sort2 # 如果不是0的话,说明还没到终点 还需要进行第二层循环
addi $t7 $t7 1 # 外层计数加一
j sort1 # 进行外层循环
swap:
# 进行交换,交换地址是 t3 t4 对应的值是 a1 a2
sw $a1 0($t4)
sw $a2 0($t3)
j sort3
output:
move $t7 $zero # 用于计数 控制输入
addi $t8 $zero 10 # 总共有10个数
print_all:
move $t0 $t7 # 将 t7的数放到这个临时的t0上
mul $t0 $t0 4 # 得到偏移量
add $t0 $t0 $t6
lw $a0 0($t0) # 所得到的地址的的数 load到 a0上
li $v0 1
syscall
la $a0 space_str
li $v0 4
syscall
addi $t7 $t7 1
blt $t7 $t8 print_all
jr $ra
li $v0 10 # 退出
syscall
.data
array:
.space 2048 # 开辟数组空间
input_msg:
.ascii "Input number: " # 输入数字提示符
space_str:
.ascii "\n" # 输出空格信息