MIPS汇编语言实现选择排序

  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。只要适当修改,就可以实现真正的选择排序。——在源代码中增加一段用户输入数组长度的代码语句即可。

冒泡排序是一种简单的排序算法,可以用MIPS汇编语言实现。下面是一个基于MIPS汇编语言的冒泡排序示例: ``` # $a0 - 存放数组的起始地址 # $a1 - 数组长度 .data array: .word 5, 2, 3, 8, 6 # 初始化一个数组 newline: .asciiz "\n" .text .globl main main: la $a0, array # 将数组地址存储在$a0中 lw $a1, array+4 # 将数组长度存储在$a1中 addi $a1, $a1, -1 # 数组长度-1 outerloop: li $t0, 1 # 将标志位$t0设置为1 li $t1, 0 # 将$i的初值设置为0 innerloop: add $t2, $a0, $t1 # 计算第$i个元素的地址 lw $t3, ($t2) # 将第$i个元素存储在$t3中 addi $t4, $t1, 4 # 计算下一个元素的地址 add $t5, $a0, $t4 # 计算下一个元素的地址 lw $t6, ($t5) # 将下一个元素存储在$t6中 ble $t3, $t6, skipswap # 如果$t3 <= $t6,则跳过交换 sw $t3, ($t5) # 否则,交换$t3和$t6 sw $t6, ($t2) li $t0, 0 # 设置标志位$t0为0,表示进行了交换 skipswap: addi $t1, $t1, 4 # 增加$i的值 blt $t1, $a1, innerloop # 如果$i < n - 1,则继续循环 beqz $t0, outerloop # 如果标志位$t0为0,则继续外部循环 # 打印排序后的数组 li $v0, 4 la $a0, newline syscall la $a0, array printloop: lw $a1, ($a0) li $v0, 1 syscall la $a0, newline li $v0, 4 syscall addi $a0, $a0, 4 blt $a0, array+20, printloop li $v0, 10 # 退出程序 syscall ``` 在上面的示例代码中,我们首先定义了一个包含一些随机数字的数组。然后,我们使用`lw`指令将数组的起始地址存储在寄存器`$a0`中,将数组长度存储在寄存器`$a1`中。接下来,我们使用两个循环来实现冒泡排序。外部循环用于控制每一轮比较和交换,内部循环用于比较和交换相邻的元素。最后,我们使用`syscall`指令将排序后的数组打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kiloveyousmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值