MIPS汇编语言实现选择排序算法

原创 2018年04月15日 16:17:14

MIPS汇编语言实现选择排序算法

1.流程图

这里写图片描述

2.C代码

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main()
{
    uint32_t num = 10 ;
    uint32_t *arr = malloc(sizeof(uint32_t)*num);
    printf("Please input:");
    printf("%u",num);
    printf(" unsigned integer, with one integer in one line:\n");
    for(uint32_t i = 0 ; i < num ; i ++ )
    {
        scanf("%u",&arr[i] );
    }
    for(uint32_t i = 0 ; i < num ; i ++ )
    {    
        uint32_t max = i ;
        for( uint32_t j = i + 1 ; j < num ; j ++ )
        {
            if(arr[j] > arr[max])
            {
                max = j ;
            }
        }
        uint32_t temp = arr[i] ;
        arr[i] = arr[max];
        arr[max] = temp ;
    }
    printf("Result: ");
    for(uint32_t i = 0 ; i < num ; i ++ )
    {
        printf(" ");
        printf("%u",arr[i]);
    }
    printf("\n");
    free(arr);
}

3.MIPS代码(附注释)

.text                    
.globl main              

main:                    
  la $a0, prompt1        # 打印 prompt1
  li $v0, 4
  syscall

  la $t0, num            # 把10这个数字存到寄存器t0中

  lw $t0, ($t0)          

  add $a0, $t0, $0       # 打印数字10
  li $v0, 1
  syscall

  la $a0, prompt2        # 打印 prompt2
  li $v0, 4
  syscall

  sll $a0, $t0, 2        # 为数组申请空间
  li $v0, 9              
  syscall

  add $t1, $v0, $0       # t1寄存器中存数组首地址

  add $t2, $0, $0        # 把临时变量i存到寄存器t2中

 inputLoop:
  slt   $t3, $t2, $t0        # for循环判断条件如果i < 10 置t3为1否则置t3为0 
  beq $t3, $0, inputLoopBreak

  li $v0, 5              # 读一个数字
  syscall

  sll $t3, $t2, 2        # 求出i的偏移量

  add $t3, $t1, $t3      # 找到arr[i]的地址
  sw $v0, ($t3)          # arr[i] = 输入的数字
  j inputLoopCont        

 inputLoopCont:
  addi $t2, $t2, 1       # i ++ 
  j inputLoop           

 inputLoopBreak:
  add $t2, $0, $0        # i = 0 

 outerLoop:
  slt   $t3, $t2, $t0       # for循环判断条件如果i < 10 置t3为1否则置t3为0
  beq $t3, $0, outerLoopBreak

  add $t4, $t2, $0       # max = i 
  addi $t5, $t2, 1       # j = i + 1 

 innerLoop:
  slt   $t3, $t5, $t0       # for循环判断条件如果j < 10置t3为1否则置t3为0
  beq $t3, $0, innerLoopBreak

  # get arr[j]
  sll $t3, $t5, 2        # 求出j的偏移量

  add $t3, $t1, $t3      # 找到arr[j]
  lw $t3, ($t3)          # 把t3中存放的数字拿出来

  # get arr[maxIndex]
  sll $t6, $t4, 2        # 找到max的偏移量

  add $t6, $t1, $t6      # 找到arr[max]
  lw $t6, ($t6)          # 把t6中存放的数字拿出来

  slt $t3, $t3, $t6      # 判断arr[j]与arr[max]大小
  bne $t3, $0, afterReplace

 replace:
  add $t4, $t5, $0       # max = j 
  j afterReplace

 afterReplace:
  j innerLoopCont        # continue

 innerLoopCont:
  addi $t5, $t5, 1       # j++
  j innerLoop            

 innerLoopBreak:
  beq $t2, $t4, afterSwap  # 如果 i = max 不交换

 swap:

  sll $t3, $t2, 2        # 计算i偏移量

  add $t3, $t1, $t3      # 求出arr[i]

  sll $t5, $t4, 2        # 计算max偏移量

  add $t5, $t1, $t5      # 求出arr[max]

  lw $t6, ($t3)          # 取出arr[i]

  lw $t7, ($t5)          # 取出arr[max]

  sw $t7, ($t3)          # 交换

  sw $t6, ($t5)          


  j afterSwap            

 afterSwap:
  j outerLoopCont        # 继续循环

 outerLoopCont:
  addi $t2, $t2, 1       # i++
  j outerLoop            # 进入外层循环

 outerLoopBreak:
  la $a0, result
  li $v0, 4
  syscall
  add $t2, $0, $0       # i = 0 

 outputLoop:
  slt   $t3, $t2, $t0       # 判断 i < 10 是否成立
  beq $t3, $0, outputLoopBreak

  la $a0, space          # 打印空格
  li $v0, 4
  syscall

  sll $t3, $t2, 2        # 求出i的偏移量

  add $t3, $t1, $t3     
  lw $a0, ($t3)          # 把t3中存放的数字拿出来存入a0

  li $v0, 1              # 打印数字
  syscall

  j outputLoopCont       

 outputLoopCont:
  addi $t2, $t2, 1       # i++
  j outputLoop          

 outputLoopBreak:
  la $a0, newline        # 打印换行
  li $v0, 4
  syscall

  li $v0, 10             # 退出
  syscall

.data                    # 数据声明模块
  prompt1:
    .asciiz "Please input "

  prompt2:
    .asciiz " unsigned integers, with one integer in one line:\n"

  result:
    .asciiz "Result:"

  space:
    .asciiz " "

  newline:
    .asciiz "\n"

  num:
    .word 0x0000000a

汇编语言程序设计

汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在2017年1月的TIOBE排行榜上,再次进入前十。对大多数学习计算机的人士而言,是理解计算机系统核心知识的一个桥梁,在人才培养中也起着特殊的作用。课程面向计算机初学者,介绍汇编语言程序设计最基础的部分。
  • 2017年03月01日 22:19

选择排序(汇编实现)

刚学汇编,于是用汇编编写了选择排序算法,初学真是各种心累啊。 (选择排序思想即为每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。) DATA SEGM...
  • u013519226
  • u013519226
  • 2016-05-03 22:35:24
  • 1065

用mips 汇编语言编写的冒泡排序

  • 2008年11月26日 15:24
  • 4KB
  • 下载

MIPS汇编语言实现选择排序

MIPS汇编语言实现排序算法,其实并不难。只要你掌握了基本的指令语句,并且熟悉C或C++相关算法,即可轻松写出来。...
  • Kiloveyousmile
  • Kiloveyousmile
  • 2017-04-04 03:48:39
  • 1180

用汇编语言实现冒泡排序——基于MIPS指令系统

欢迎访问我的个人博客:Talk is cheap. Show me the code!。我相信会有所收获的。 这是计组第一个小实验,实现从键盘输入十个数字,并把它们按从大到小排序输出。 冒泡排序流...
  • sinat_31790817
  • sinat_31790817
  • 2017-04-06 09:03:11
  • 3735

汇编语言的简单入门--斐波那契数列(非递归)

根据函数 F(0)=0;F(1) = 1;F(n) = F(n-2) + F(n-1);   TITLE Save an array and dispaly INCLUDE Irvine32.in...
  • YtdxYHZ
  • YtdxYHZ
  • 2013-10-03 04:15:16
  • 5663

mips汇编语言实现Fibonacci(斐波那契)数列

程序已在pcspim 7.0 下编译通过########## by stevie zou####    fibonacii###      10-16-2008####################...
  • yihaozou
  • yihaozou
  • 2008-10-16 23:20:00
  • 7158

排序算法实现以及比较

本文介绍了常用的内排序算法包括比较排序算法(插入排序、冒泡排序、选择排序、快速排序、归并排序、堆排序)和基于运算的排序算法(基数排序、桶排序)。分别对这些算法从算法思想、伪代码、复杂度和稳定性、算法的...
  • zhangph1229
  • zhangph1229
  • 2016-07-31 19:33:28
  • 1344

8086汇编语言实现快速排序算法

.model small .stack .data array db 12,45,13,9,45,48,68,32,5,11 count equ $-array .code .startup mov ...
  • smzx_boy2012
  • smzx_boy2012
  • 2014-11-04 20:51:48
  • 2752

内嵌汇编与C/C++实现的冒泡排序,快速排序算法排序500W个数据对比

内嵌汇编是微软为了提高程序的优化能力而嵌入在VC中的,这意味着你如果在C/C++程序中使用了 inline  asm进行 汇编 那么 就注定无法跨平台的,对于没有汇编基础的同学是需要去学习下 的,因为...
  • yue7603835
  • yue7603835
  • 2014-12-08 18:37:26
  • 3072
收藏助手
不良信息举报
您举报文章:MIPS汇编语言实现选择排序算法
举报原因:
原因补充:

(最多只允许输入30个字)