MIPS汇编语言实现hello world和冒泡排序

news2024/12/23 0:31:32

WinMIPS64的IO方法输出hello world

编写一个简单的终端输出“Hello World!!”的小程序,首先写好一些数据包括CONTROL和DATA的地址以及字符串Hello World,然后将CONTROL和DATA的地址存储在寄存器中以之作为基址,将字符串首地址写入DATA,将4写入CONTROL

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
mes:	.asciiz "Hello World!\n"
	
	.text
	daddi r1,r0,mes
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
	halt

 用asm.exe检验该程序的语法,如图所示,语法无误。

 运行程序,其中terminal窗口如图所示,说明我们的程序成功打印出来Hello World。

冒泡排序

课本上的swap函数和sort函数对于排序这64位的整数是不适合的,而且也有些许的bug,因此我选择自己重写这两个函数。

首先先初始化一些数据,包括需要排序的数据和数据的长度以及需要输出的字符串和CONTROL和DATA的地址

	.data
array: 	.word 8,6,3,7,1,0,9,4,5,2
size:	.word 10
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
before:	.asciiz "before sort the array is:\n"
after: 	.asciiz "after sort the array is:\n"

先写一个swap函数,大体上与课本上的相同,不过我加上了所对使用寄存器的栈保存

swap:	daddi r29,r29,-16
	sw r8,12(r29)
	sw r9,8(r29)
	sw r10,4(r29)
	sw r31,0(r29)

	dsll r9,r5,3
	dadd r9,r4,r9
	lw r8,0(r9)
	lw r10,8(r9)
	sw r10,0(r9)
	sw r8,8(r9)

	lw r31,0(r29)
	lw r10,4(r29)
	lw r9,8(r29)
	lw r8,12(r29)
	daddi r29,r29,16
	jr r31

然后写sort函数,同样是要注意使用栈来保存所使用到的寄存器的值,特别是寄存器r31,即$ra的值,其中保存着函数调用的返回地址,然后便是两层循环加一个判断跳转swap函数

sort:	daddi r29,r29,-28
	sw r31,24(r29)
	sw r1,20(r29)
	sw r2,16(r29)
	sw r3,12(r29)
	sw r8,8(r29)
	sw r9,4(r29)
	sw r10,0(r29)
	
	lw r10,size(r0)
	daddi r10,r10,-1
	daddi r1,r0,0
loop2:	daddi r2,r0,0
loop3:	dsll r3,r2,3
	lw r8,array(r3)
	daddi r3,r3,8
	lw r9,array(r3)
	slt r3,r8,r9
	bnez r3,fine
	dadd r5,r2,r0
	daddi r4,r0,array
	jal swap
fine:	daddi r2,r2,1
	bne r2,r10,loop3
	daddi r1,r1,1
	bne r1,r10,loop2
	
	lw r10,0(r29)
	lw r9,4(r29)
	lw r8,8(r29)
	lw r3,12(r29)
	lw r2,16(r29)
	lw r1,20(r29)
	lw r31,24(r29)
	daddi r29,r29,28
	jr r31

然后再写一个输出数据的函数,因为要输出两次数据,所以写成一个函数比较方便

show:	daddi r29,r29,-16
	sw r1,12(r29)
	sw r2,8(r29)
	sw r3,4(r29)
	sw r4,0(r29)

	lw r4,size(r0)
	daddi r1,r0,0
loop1:	dsll r3,r1,3
	lw r2,array(r3)
	lw r3,DATA(r0)
	sw r2,0(r3)
	daddi r2,r0,2
	lw r3,CONTROL(r0)
	sw r2,0(r3)
	daddi r1,r1,1
	bne r1,r4,loop1

	lw r4,0(r29)
	lw r3,4(r29)
	lw r2,8(r29)
	lw r1,12(r29)
	daddi r29,r29,16
	jr r31	

最后是主函数的编写,先初始化栈指针寄存器的值为内存最高地址,然后在开始和结束都输出一次字符串和调用一次输出函数,中间调用一次排序函数

main:	daddi r29,r0,0x03f8
	daddi r1,r0,before
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	jal sort

	daddi r1,r0,after
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	halt

使用asm.exe检验所写的程序语法正确性,无语法错误

 运行程序,证明程序成功对数组排序

全部代码如下 

	.data
array: 	.word 8,6,3,7,1,0,9,4,5,2
size:	.word 10
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
before:	.asciiz "before sort the array is:\n"
after: 	.asciiz "after sort the array is:\n"

	.text

main:	daddi r29,r0,0x03f8
	daddi r1,r0,before
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	jal sort

	daddi r1,r0,after
	lw r2,DATA(r0)
	sw r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sw r1,0(r2)

	jal show

	halt

show:	daddi r29,r29,-16
	sw r1,12(r29)
	sw r2,8(r29)
	sw r3,4(r29)
	sw r4,0(r29)

	lw r4,size(r0)
	daddi r1,r0,0
loop1:	dsll r3,r1,3
	lw r2,array(r3)
	lw r3,DATA(r0)
	sw r2,0(r3)
	daddi r2,r0,2
	lw r3,CONTROL(r0)
	sw r2,0(r3)
	daddi r1,r1,1
	bne r1,r4,loop1

	lw r4,0(r29)
	lw r3,4(r29)
	lw r2,8(r29)
	lw r1,12(r29)
	daddi r29,r29,16
	jr r31	

swap:	daddi r29,r29,-16
	sw r8,12(r29)
	sw r9,8(r29)
	sw r10,4(r29)
	sw r31,0(r29)

	dsll r9,r5,3
	dadd r9,r4,r9
	lw r8,0(r9)
	lw r10,8(r9)
	sw r10,0(r9)
	sw r8,8(r9)

	lw r31,0(r29)
	lw r10,4(r29)
	lw r9,8(r29)
	lw r8,12(r29)
	daddi r29,r29,16
	jr r31
	
sort:	daddi r29,r29,-28
	sw r31,24(r29)
	sw r1,20(r29)
	sw r2,16(r29)
	sw r3,12(r29)
	sw r8,8(r29)
	sw r9,4(r29)
	sw r10,0(r29)
	
	lw r10,size(r0)
	daddi r10,r10,-1
	daddi r1,r0,0
loop2:	daddi r2,r0,0
loop3:	dsll r3,r2,3
	lw r8,array(r3)
	daddi r3,r3,8
	lw r9,array(r3)
	slt r3,r8,r9
	bnez r3,fine
	dadd r5,r2,r0
	daddi r4,r0,array
	jal swap
fine:	daddi r2,r2,1
	bne r2,r10,loop3
	daddi r1,r1,1
	bne r1,r10,loop2
	
	lw r10,0(r29)
	lw r9,4(r29)
	lw r8,8(r29)
	lw r3,12(r29)
	lw r2,16(r29)
	lw r1,20(r29)
	lw r31,24(r29)
	daddi r29,r29,28
	jr r31

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础快速自学SQL,2天足矣。

此文是《10周入门数据分析》系列的第6篇。 想了解学习路线,可以先行阅读“ 学习计划 | 10周入门数据分析 ” 上一篇分享了数据库的基础知识,以及如何安装数据库,今天这篇分享数据库操作和SQL。 SQL全称是 Structured Query Language&#x…

什么是Web组件(Web Components)?它们的主要部分有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

深度学习笔记之优化算法(五)AdaGrad算法的简单认识

机器学习笔记之优化算法——AdaGrad算法的简单认识 引言回顾:动量法与Nesterov动量法优化学习率的合理性AdaGrad算法的简单认识AdaGrad的算法过程描述 引言 上一节对 Nesterov \text{Nesterov} Nesterov动量法进行了简单认识,本节将介绍 AdaGrad \text{…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代,网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

每个前端都要学的【前端自动化部署】,Devops,CI/CD

原文发布于:2023-09-21 11:50 作者:65岁退休Coder 原文链接:https://juejin.cn/post/7102360505313918983 DevOps 当我们提到 Jenkins,大家首先想到的概念就是 CI/CD,在这之前我们应该再了解一个概念。 DevOps&#…

3.springcloudalibaba gateway项目搭建

文章目录 前言一、搭建gateway项目1.1 pom配置1.2 新增配置如下 二、新增server服务2.1 pom配置2.2新增测试接口如下 三、测试验证3.1 分别启动两个服务,查看nacos是否注册成功3.2 测试 总结 前言 前面已经完成了springcloudalibaba项目搭建,接下来搭建…

js 之让人迷惑的闭包

文章目录 一、闭包是什么? 🤦‍♂️二、闭包 😎三、使用场景 😁四、使用场景(2) 😁五、闭包的原理六、思考总结一、 更深层次了解闭包,分析以下代码执行过程二、闭包三、闭包定义四、…

每日一题 2578. 最小和分割(简单,模拟)

思路: 拆分 num 的每一位数字,将他们排序。最大的两个放在个位,其次两个放十位,以此类推。注意并不需要重新组合出 num1 和 num2 ,他只要和即可。优化,可以不使用排序,因为只有 0 到 9 一共十个…

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划(一) 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…

jmeter怎样的脚本设计才能降低资源使用

官网地址:Apache JMeter - Users Manual: Best Practices 1、用好断言 频繁的使用断言会加大资源的消耗,尽可能减少断言的使用,或者在使用的过程中断言数据文本尽量精简 2、使用命令执行 启动的时候就提示我们在执行压测的时候应该用命令执…

自动化测试框架有哪些?怎么选?今天我来告诉你

前言 随着软件开发过程中的复杂度不断提高,自动化测试成为了一个必要的手段。Python作为一种灵活易用的编程语言,已经成为自动化测试领域的一种主流工具。Python自动化测试框架可以使得我们更加方便地进行测试脚本的编写和执行,同时也可以提…

【力扣】2. 两数相加

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…

Centos指令合集

2023-10-09 防火墙 开启 systemctl start firewalld自启动 systemctl enable firewalld.service关闭 systemctl stop firewalld禁用 systemctl disable firewalld.service查看状态 systemctl status firewalld

OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换

文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心,之后确定旋转…

Windows10打开应用总是会弹出提示窗口的解决方法

用户们在Windows10电脑中打开应用程序,遇到了总是会弹出提示窗口的烦人问题。这样的情况会干扰到用户的正常操作,给用户带来不好的操作体验,接下来小编给大家详细介绍关闭这个提示窗口的方法,让大家可以在Windows10电脑中舒心操作…

Java Agent初探

1:Java Agent简介 Java Agent 这个技术出现在 JDK1.5 之后,对于大多数人来说都比较陌生,但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于 Java Agent 实现的,例如常见的热部署 JRe…

电脑中的opencl.dll丢失怎么办,三步解决opencl.dll丢失

最近有不少用户都遇到了opencl.dll丢失的情况,其实解决opencl.dll丢失的办法很简单,今天就来教大家如何用三步解决opencl.dll丢失的问题。 一.了解opencl.dll opencl.dll是OpenCL的动态链接库文件。OpenCL(Open Computing Language&#xff…

上班第一天同事让我下载个小乌龟,我就去百度小乌龟。。。。

记得那会儿是刚毕业,去上班第一天,管我的那个上级说让我下载个小乌龟,等下把代码拉一下,我那是一脸懵逼啊,我在学校只学过git啊,然后开始磨磨蹭蹭吭吭哧哧的不知所措,之后我想也许百度能救我&am…

华为云云耀云服务器L实例评测 | 实例使用教学之高级使用:配置 Git SSH Key 进行自动识别拉代码

华为云云耀云服务器L实例评测 | 实例使用教学之高级使用:配置 Git SSH Key 进行自动识别拉代码 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…

05-进程控制

1. 学习目标 了解进程相关的概念掌握fork/getpid/getppid函数的使用熟练掌握ps/kill命令的使用熟练掌握execl/execlp函数的使用说出什么是孤儿进程什么是僵尸进程熟练掌握wait函数的使用熟练掌握waitpid函数的使用 2 进程相关概念 2.1 程序和进程 程序,是指编译好…