MIPS汇编语言实现排序算法,其实并不难。只要你掌握了基本的指令语句,并且熟悉C或C++相关算法,即可轻松写出来。对于MIPS汇编语言还不太熟悉的伙伴,可以参考下面这篇博客:http://blog.csdn.net/ben_chong/article/details/51794392。
它的具体实现代码如下:
``````
**********************C++代码************************
#include<iostream>
using namespace std;
int main(){
int num[10];
int i, j, max, index;
for(i = 0; i < 10; i++)
cin>>num[i];
for(i = 0; i < 9; i ++){
max = num[i];
index = i;
for(j = i+1; j < 10; j++){
if(max < num[j]){
max = num[j];
index = j;
}
}
num[index] = num[i];
num[i] = max;
}
for(i = 0; i < 10; i++)
cout<<num[i]<<" ";
}
**********************MIPS汇编代码************************
.text # 代码段 声明
.globl main # globl指明程序的入口地址main
main: # 程序入口地址
la $a0,input_num_msg # 取字符串首地址
li $v0,4 #4号功能调用,输出字符串
syscall #系统调用,输出字符串
la $t6,array # $t6 是数组首地址
move $t7,$zero # $t7 是循环变量i
addi $t8,$zero,10 # $t8 是数组长度
move $t9,$zero # $t9 是循环变量j
input: # input代码块用于完成数组元素的输入
la $a0,input_int_msg # 取字符串首地址
#打印字符串,提示用户输入数组的元素
li $v0,4
syscall
li $v0,5
syscall
move $t0,$t7 # 此处类似于C/C++中指针访问数组元素的方法
mul $t0,$t0,4 # 数组元素所占字节数*循环变量+数组的起始地址=数组[循环变量]
addu $t1,$t0,$t6 # '无符号数字相加
sw $v0,0($t1) # ''把$v0的数据存入到$t1中,地址偏移量为0
addi $t7,$t7,1 # $t7 = $t7 +1 循环变量i+1
blt $t7,$t8,input # branch to input if $t7 < $t8
move $t7,$zero # 完成输入后将循环变量置为0,可作为下一个循环的循环变量,以节省寄存器; $t7作为 i
loop1:
addu $t9,$t7,1 # 每次执行外层循环都将内层循环的循环变量置为i+1
mul $t0,$t7,4 #获取a[i],作为max,即$t2 为max
addu $t1,$t0,$t6
lw $t2,0($t1) #偏移量,寻址
move $t5,$t1 #初始化最后一次和max交换的j的值
loop2:
move $t0,$t9 #获取a[j]
mul $t0,$t0,4
addu $t4,$t0,$t6
lw $t3,0($t4)
bge $t2,$t3,skip # 如果a[i] > a[j],跳转到skip代码块
lw $t2,0($t4) # 否则就执行下面这两句,赋值
move $t5,$t4 #记录下j的值
skip:
addi $t9,$t9,1 # 内层循环变量自增
blt $t9,$t8,loop2 # 且判断是否还满足循环条件,如果满足,则跳转到loop2
lw $t4,0($t1) # 如果不满足,先进行赋值
sw $t4,0($t5)
sw $t2,0($t1) #'赋值
addi $t7,$t7,1 # 再将外层循环的循环变量自增
addi $t4,$t7,1 #且判断是否还满足循环条件
blt $t4,$t8,loop1 # 如果满足,则跳转到loop1
# 如果不满足,则不跳转,继续执行下面的代码
output:
la $a0,output_int_msg # 打印字符串,提示用户即将输出程序
li $v0,4
syscall
move $t7,$zero # 将循环变量置为0,用于下一循环,节省寄存器
print: # 实现打印数组元素
move $t0,$t7
mul $t0,$t0,4
addu $t1,$t0,$t6
lw $a0,0($t1)
li $v0,1
syscall
la $a0,seperate # 分隔数组元素
li $v0,4
syscall
addi $t7,$t7,1
blt $t7,$t8,print # 如果满足循环条件,跳转到print继续执行循环
.data # 数据段声明
array:.space 10 # 给array分配10个空间
input_num_msg:.asciiz "Please enter 10 unsigned number:\n"
input_int_msg:.asciiz "Please enter an unsigned integers to be sorted:\n"
output_int_msg:.asciiz "The sorted numbers are:\n"
seperate:.asciiz " "
当然,我的代码里的数组长度已经固定为10。只要适当修改,就可以实现真正的选择排序。——在源代码中增加一段用户输入数组长度的代码语句即可。