感谢此文章的参考:http://blog.csdn.net/linwh8/article/details/68944058
第一次写MIPS就要写排序,不得不说这学期的计算机组成原理实验课有点艰辛,等下还要写完实验报告,有点困
MIPS的话主要分为几部分
.data部分
个人认为是一些前期准备,比如:给字符串中字符与某个变量关联起来、申请内存空间等
.text
.globl main部分
这是重点
代码基本就在这其中完成
话不多说来看看代码
##################################################
# #include<iostream>
# using namespace std;
# int main()
# {
# int num=5;
# int a[5];
# for(int i=0;i<num;i++)
# cin>>a[i];
# for(int i=0;i<num;i++)
# {
# for(int j=i;j>0;j--)
# {
# if(a[j]<a[j-1])
# {
# int temp=a[j];
# a[j]=a[j-1];
# a[j-1]=temp;
# }
# }
# }
# for(int i=num-1;i>=0;i--)
# cout<<a[i]<<" ";
# }
##################################################
.text
.globl main
main:
addi $v0,$zero,10 # $v0 数组长度设置为10
la $t6,array # $t6 是数组首地址
move $t7,$zero # $t7 是循环变量i
move $t8,$v0 # $t8 是数组长度
move $t9,$zero # $t9 是循环变量j
input:
li $v0,5 # 读取用户输入的数字
syscall
move $t0,$t7 # $t0取i
sll $t0,$t0,2 # $t0变为其字节地址
addu $t1,$t0,$t6 # $t0变为数组中字节地址
sw $v0,0($t1) # 把用户输入的数字保存到$t0中
addi $t7,$t7,1 # 数组+1
blt $t7,$t8,input # 比较当前数组序号与数组长度,如果还未填满数组,则跳转到input再进行输入
move $t7,$zero # 若已经填满数组,则结束输入模块,$t7置0方便下次使用
loop1:
move $t9,$t7 #循环的j重置为i
loop2:
move $t0,$t9 #$t0取j
sll $t0,$t0,2 #$t0变为其字节地址
addu $t0,$t0,$t6 #$t0变为数组中字节地址
lw $t1,0($t0) #$t1获取$t0中元素
addi $t3,$t0,-4 #$t0取数组中j-1的字节地址
lw $t2,0($t3) #$t2获取$t0中元素
bge $t1,$t2,skip #若$t2小于$t1,则跳转到skip
sw $t2,0($t0) #若$t2大于$t1,则两者进行交换,交换后再跳转到skip
sw $t1,0($t3)
skip:
addi $t9,$t9,-1 #j-1
blt $zero,$t9,loop2 #如果j大于0,则跳转到loop2
addi $t7,$t7,1 #如果j小于0,则i+1后跳转到loop1
blt $t7,$t8,loop1
middo:
addi $t8,$t8,-1
move $t7,$t8 #中途处理,$t7(i)置为$t8-1
addi $t2,$zero,-1
print:
move $t0,$t7 #$t0获取$t7中元素
sll $t0,$t0,2 #$t0变为其字节地址
addu $t0,$t0,$t6 #$t0变为数组中字节地址
lw $a0,0($t0) #$a0获取$t0中元素
li $v0,1 #打印$a0
syscall
la $a0,separate #打印空格符号
li $v0,4
syscall
addi $t7,$t7,-1 #i--
blt $t2,$t7,print #如果i大于等于0,则继续执行print
.data
array:.space 400 #申请400字节内存
separate:.asciiz" " #把separate变量与空格关联起来
其中第一次发生了错误
真是令人窒息
debug全靠猜
后来发现了第一次代码中
更改为
程序即可正常运行( ̄_ ̄|||)
我内心里一顿无奈
浪费了很多时间
这样看来MIPS两个sw是并行的?所以产生了错误?
这个真没弄懂
明早上课问问老师
第一次写MIPS就这样愉快的结束了(写一上午写了个bug一点也不愉快= =)