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

2023-11-07

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MIPS汇编语言实现选择排序算法 的相关文章

  • 汇编语言(十)——条件判断指令

    首先了解按位指令 xff0c 这里使用的技术也可以用于操作硬件设备控制位 xff0c 实现通信协议以及加密数据 xff0c 操作说明AND源操作数和目的操作数进行逻辑与操作OR源操作数和目的操作数进行逻辑或操作XOR源操作数和目的操作数进行
  • 汇编语言,数据段中,标号前面加不加offset有什么区别?

    data segment string db 40h dup 0 string 1 db 39 Input characters 39 0dh 39 39 data ends 那么 xff0c mov bx string 和 mov bx
  • 汇编语言

    基础知识 1 1机器语言 计算机的机器指令是一列二进制数字 计算机将之为转变为一列高低电平 xff0c 以使计算机的电子器件受到驱动 xff0c 进行运算 1 2 汇编语言的产生 程序员 汇编指令 编译器 机器码 计算机 1 3 汇编语言的
  • [go]汇编语言

    文章目录 计算机结构常量与变量全局变量常量数组字符串 函数参数与返回值goroutine Go汇编程序无法独立使用 xff0c 必须以Go包的方式组织 xff0c 同时包中至少要有一个Go语言文件用于指明当前包名等基本包信息 如果Go汇编代
  • 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04

    80X86中断系统 能够处理256个中断 用中断向量号0 xff5e 255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1 中断的分类 中断可以分为内部中断和外部中断 xff08 1 xff09 内部中断
  • 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37

    任务切换的方法 x86汇编语言 xff1a 从实模式到保护模式 读书笔记37 1 中断门和陷阱门 在实模式下 xff0c 内存最低端的1M是中断向量表 xff0c 保存着256个中断处理过程的段地址和偏移 当中断发生时 xff0c 处理器把
  • ARM汇编语言 - 简介 [二]

    上文介绍了ARM的数据传送指令 xff0c 本文将主要介绍ARM中的移位 序转和位操作等数据处理指令 移位指令 移位包括逻辑移位和算术移位 xff0c 所谓 逻辑 就是将寄存器中存放的内容仅仅视为一串bits xff0c 移位的时候只需要将
  • 汇编语言----mul指令

    mul指令 把操作数与AX相乘 最后存放在AX中 例子 mov ax 4 mov bx 5 mul bx ax 20
  • [从零学习汇编语言] - 标志寄存器

    文章目录 前言 一 标志寄存器的简介 二 标志位详解 2 1 ZF标志 2 2 PF标志 2 3 SF标志 2 4 CF标志 2 4 1 无符号运算 2 4 2 有符号运算 2 5 OF标志 2 5 1 CF标志及OF标志的区别 2 6 D
  • [从零学习汇编语言] - 转移指令进阶

    文章目录 前言 回顾 1 转移指令原理 2 已接触过的操作符 3 寄存器回顾 通用数据处理寄存器 指针寄存器 变址寄存器 段地址寄存器 其他寄存器 一 ret及retf 1 1 ret指令 1 2 retf指令 1 3 小练习 二 Call
  • 汇编语言数据处理长度(X ptr指令解析)

    文章目录 1 通过寄存器名指明要处理的数据的尺寸 2 在没有寄存器名存在的情况下 用操作符 X ptr 指明内存单元的长度 X在汇编指令中可以为byte word或dword 3 其他方法 8086CPU的指令 可以处理两种尺寸的数据 by
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • ARM汇编指令集——跳转指令、内存传输指令、软中断产生指令、协处理器指令、伪指令、伪操作(如何从底层直接操纵CPU)

    一 跳转指令 完成程序跳转 实质就是对PC操作 赋值 b bl跳转是短跳转 跳转范围 32MB start mov r0 1 mov r1 2 mov r3 3 b func b跳转 不带返回值 mov r4 4 func mov r5 5
  • arm ldr/ld/数据加载系列指令和adr指令

    ldrb指令 1 语法 armv7手册语法 LDRB
  • IDA反汇编之栈帧例释

    目录 1 例释环境和预备知识 1 1 运行环境 1 2 IDA版本 1 3 预备知识 2 函数调用约定 3 函数局部变量布局 4 函数栈帧示例 5 IDA栈视图 1 例释环境和预备知识 1 1 运行环境 本示例运行环境为Windows 10
  • Ubuntu系统下《汇编语言》环境配置

    说明 1 系统 Ubuntu codists pc lsb release a No LSB modules are available Distributor ID Ubuntu Description Ubuntu 21 10 Rele
  • 8259初始化命令字(ICW1-ICW4)

    8259A的中断操作功能很强 包括中断的请求 屏蔽 排队 结束 级联以及提供中断类型号和查询等操作 并且其操作的方式又有不同 它既能实现向量中断 又能进行中断查询 它可以用于16位机 也可用于8位机 因此 使用起来感到复杂且不好掌握 为此
  • C++反汇编 利用反汇编分析常见C/C++语句的底层实现(硬核)

    文章目录 赋值操作 if条件判断 指针和引用的实质 跳转函数 两个数字的交换操作 数组的赋值及 858993460数字的由来 总结 本节我们利用反汇编技术来对我们最常见的C语言语句进行解析 C 反汇编技术可以让你更好的理解C C语言的底层含
  • x86 32位机的特权保护

    优先级划分 指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础 本文将试图讲解为大家解决两大问题 win32汇编中为什么找不到中断指令的应用 比如int 7ch windows错误的 蓝屏 是从哪里来的 保护模式下 中断或异常往往
  • DOSBOX 快捷键及 MS-DOS 命令

    1 全屏 退出全屏 alt enter 2 释放鼠标 ctrl F10 3 exit 退出DOSBOX 4 dir 显示目录内容 可选参数 w 只显示文件名 P 显示部分内容 exe 筛选出可执行文件 5 cd 进入目录 cd 退回上一级目

随机推荐

  • C++学习之gcc编译四步

    C 学习之gcc编译四步 一 linux下编写Hello World 代码文件 二 gcc编译四步 1 预处理 Preprocessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 三 执行 四
  • 论文学习(一)——MWP-BERT: Numeracy-Augmented Pre-training for Math WordProblem Solving

    记录一下自己的第一篇论文学习 摘要 数学应用题 MWP 的求解面临着数字表示学习的困境 为了避免数字表示的问题 并且减少可行解的搜索空间 现有求解MWP的工作通常用符号占位符代替实数 以便专注于逻辑推理 然而 不同于常见的符号推理任务 如程
  • STM32——STM32F103系列学习笔记(纯干货版)

    一 RCC函数 关于RCC函数的使用配置如下 一 定时器资源分配 关于定时器资源分配如下
  • Timer源码分析

    java util Timer简介 Timer是用于管理在后台执行的延迟任务或周期性任务 其中的任务使用java util TimerTask表示 任务的执行方式有两种 按固定速率执行 即scheduleAtFixedRate的两个重载方法
  • Python入门学习01

    基础 输出 输出语句print print 输出语句 输出函数 1 在控制台输出一段文本信息 用一对英文双引号标记 print 文本信息 默认换行 2 print 文本信息 end 结尾 n 换行符 t 制表符 3 print 文本信息1
  • Thinkphp5.1开发钉钉应用:企业免登陆_PC端demo

    config gt base php
  • C语言数字炸弹

    define CRT SECURE NO WARNINGS 1 include
  • 三、Linux系统编程:进程间的通信(IPC)之消息队列

    3 IPC 进程间通信 消息队列 消息队列 Message queue 是一种进程间通信或同一进程的不同线程间的通信方式 软件的贮列用来处理一系列的输入 通常是来自用户 3 1 背景 管道和套接字比较适合两三个进程之间的通信 如果进程成倍增
  • 小米笔记本BIOS版本升级固件 小米笔记本Pro15.6【附下载地址】

    之前出厂买的bios版本太老了 个人强迫症就更新到了新版本的bios 找了三家小米官方售后部门 前两家啥技术都没 查最新的bios版本都查不到 还说我的bios就是最新的 最后一家售后才有把我升级bios 查询自己bios版本的方法 win
  • TCP报文段的首部

    TCP报文段的首部 TCP虽然是面向字节流的 但是TCP传送的数据单元是报文段 一个TCP报文段分为首部和数据两部分 TCP报文段首部的前20个字节是固定 后面有 4 n 4n 4n字节是根据需要而增加的选项 n n
  • 基于优先队列的Dijkstra算法

    前言 最短路径问题 即在给定的连接图中 求解节点之间的最短路径 Dijkstra算法是典型的单源最短路径算法 单源即只能求解某个节点到其他节点的最短路径 另外 此算法不能处理边权重为负的情况 一 最短路径问题 最短路径问题是图论的一个经典算
  • ubuntu安装ffmpeg,三行命令

    1 安装 添加ppa源 sudo add apt repository ppa djcj hybrid 更新刚才添加的源 sudo apt get update 下载ffmpeg sudo apt get install ffmpeg 遇到
  • 【React】搭建React项目

    最近自己在尝试搭建react项目 其实react项目搭建没有想象中的那么复杂 我们只需要使用一个命令把React架子搭建好 其他的依赖可以根据具体的需求去安装 比如AntDesignMobile的UI框架 执行npm install ant
  • 绿源:“老大哥”冲刺IPO,新的故事如何讲?

    又一家老牌电动两轮车企业 开 向了资本市场 11月22日 绿源集团控股 开曼 有限公司 以下简称 绿源集团 正式向港交所递交招股说明书 拟主板挂牌上市 中信建设国际担任独家保荐人 这标志着 一部车骑10年 电动车品牌绿源拉开了上市序幕 绿源
  • Android暴露组件——被忽略的组件安全

    Intent 简介 Intent 意图 负责完成Android应用 组件之间的交互与通信 常见的Activity的调用 Receiver的发送 Service的启动都需离不开Intent Intent通常包含的信息 Categpry 种类
  • springboot文件上传 MultipartFile file

    1 讲解springboot文件上传 MultipartFile file 源自SpringMVC 注意点 如果想要直接访问html页面 则需要把html放在springboot默认加载的文件夹下面 MultipartFile 对象的tra
  • Yii Framework 开发教程(28) Data Provider 简介

    这开始介绍Zii组件之前 先简要介绍一下Yii支持的数据源接口 IDataProvider IDataProvider主要功能是为UI组件如GridView ListView等提供数据源 同时也支持数据的分页和排序 下图为Yii内置的三种数
  • QQxml和json代码生成卡片的方法

    简介 最近看到qq群里总有人发一些奇怪的卡片 例如下面这个卡片 点击之后就会跳转到你自己的个人资料 是不是很神奇 其实这是依靠xml代码转成的卡片 通过一些软件对xml编译执行 可以编译xml的软件有很多 最常用的手机xml编译执行软件是华
  • Android Display架构分析

    Fence https www jianshu com p 3c61375cc15b android12 display分析 https www cnblogs com roger yu p 15641545 html hwcomper h
  • MIPS汇编语言实现选择排序算法

    MIPS汇编语言实现选择排序算法 1 流程图 2 C代码 3 MIPS代码 附注释 MIPS汇编语言实现选择排序算法 1 流程图 2 C代码 include