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汇编语言实现选择排序算法 的相关文章

  • 汇编语言,and、or指令

    and 和 or指令 and指令 xff0c 作用按位与运算 mov ax 1011 1100b mov bx 1100 1011b and ax bx ax的结果为 xff1a 1000 1000 or指令 xff0c 作用 xff1a
  • 汇编语言32位加减乘除运算题

    用16位指令编制程序 xff0c 处理32位的加减乘除算术四则运算题 本文计算 xff08 3 X 43 Y Z xff09 5的值 值分别为 xff1a span class hljs built in x span dw span cl
  • 汇编语言

    基础知识 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 内部中断
  • arm/arm64函数栈帧(stackframe)结构和传参规则

    1 概述和问题 本文汇编代码的平台及编译器 arm gcc 分析函数调用栈的规则对于理解程序运行基本原理很有帮助 汇编代码分析crash问题也大有裨益 本文示例代码通过C语言函数调用一个汇编函数 再从汇编函数跳转回C函数 分析该示例的汇编代
  • 内中断

    1 CPU根据中断码如何找到中断处理程序 要定位中断处理程序 就需要找到中断处理程序的段地址和偏移地址 如果根据中断码找到他们 这就引入中断向量表 CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址 2 使用中断类型码找
  • [从零学习汇编语言] - 模块化程序设计

    文章目录 前言 回顾 一 模块化程序设计 1 1 子程序 1 2 子程序的参数和返回值 1 3 批量数据的传递 1 4 寄存器的冲突处理 结语 前言 点赞再看 养成习惯 回顾 还记得我们之前讲过的ret指令搭配call指令实现的子程序模板吗
  • 《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab

    这是CSAPP的第三个实验 主要让我们熟悉GDB的使用 理解程序栈帧的结构和缓冲区溢出的原理 实验目的 本实验的目的在于加深对IA 32函数调用规则和栈结构的具体理解 实验的主要内容是对一个可执行程序 bufbomb 实施一系列缓冲区溢出攻
  • 汇编基础知识

    一 汇编语法 1 GNU 汇编语法适用于所有的架构 并不是 ARM 独享的 GNU 汇编由一系列的语句组成 每行一条语句 每条语句有三个可选部分 如下 label instruction comment label 即标号 表示地址位置 有
  • 如何在MacOS上玩儿汇编?

    在Mac上写汇编还是相当方便的 本文通过写一个Helloworld程序来入门 首先 MacOS 自带nasm 只是版本有点老 编译不了64位程序 只要上官网下一个最新的 替换一下就行了 有一点需要注意的是mac上gcc编译 o文件的默认入口
  • 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net m0 37564426 article details 85563170
  • 王爽老师汇编13.3对int iret和栈的深入理解 在屏幕中间显示80个叹号字符

    6666 问题 用7ch中断例程完成loop指令的功能 个人自学思考编写的 不知道和书中的要表达的意思是否相同 先编译运行第一个代码 再编译运行第二个显示代码 下面为写入内存0 200出的中断代码 iret指令为跳转指令 跳转到显示代码处
  • 汇编中16进制装换成为其他进制(2,8,10)

    16进制装换成为其他进制关键在于得到键盘输入 并将它保存在BINARY的这个变量里面 宏定义直接调用 例子中有 DISP etc 子程序的话要注意对主程序的信息的保护和恢复 我在这里使用的是在子程序里面去保护主程序的方式 你也可以在主程序调
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 汇编语言编程,将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上

    编程 将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上 题目 编程 将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上 DATAS SEGMENT db 1 display db
  • 计算机组成原理——单周期CPU

    单周期CPU 项目代码 实验原理 MIPS指令 rom coe文件 代码 顶层模块SingleCycleCPU display外围模块 PC instructionMemory Alu模块 DataMemory ControlUnit 旧的
  • [从零学习汇编语言] - BX寄存器与loop指令

    文章目录 前言 一 Bx寄存器与 偏移地址 二 loop指令与jmp指令 1 jmp指令 2 loop指令 三 一些奇奇怪怪的注意点 1 汇编源程序的数字问题 2 Debug和Masm的区别 1 mov ax 0 问题 3 段前缀 四 课后
  • arm push/pop/b/bl汇编指令

    目录 1 push指令 2 pop指令 3 b指令 4 bl指令 5 bx指令 1 push指令 功能描述 入栈 armv7 芯片手册 Push Multiple Registers stores multiple registers to
  • 汇编:表格显示(含多个子程序)

    代码如下 assume cs code data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1

随机推荐

  • 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