MIPS汇编 简单排序 最后一个数永远是0 无论怎么弄

肥宅_Sean 2017-10-14 09:15:12
汇编代码如下:
默认输入10个数
没办法汇编的代码确实很长,但很多都是注释
麻烦了!

.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" # 输出空格信息

...全文
1040 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧