MIPS汇编语言实现选择排序

来源:互联网 发布:康德…知乎 编辑:程序博客网 时间:2024/05/22 01:44

  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指明程序的入口地址mainmain:    # 程序入口地址    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 是循环变量jinput:               # 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作为 iloop1:    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。只要适当修改,就可以实现真正的选择排序。——在源代码中增加一段用户输入数组长度的代码语句即可。

1 0