前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MIPS指令集实验

MIPS指令集实验

作者头像
叶茂林
发布2023-10-09 08:13:57
1990
发布2023-10-09 08:13:57
举报
文章被收录于专栏:叶子的开发者社区

WinMIPS64的IO方法输出hello world

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

代码语言:javascript
复制
	.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的地址

代码语言:javascript
复制
	.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函数,大体上与课本上的相同,不过我加上了所对使用寄存器的栈保存

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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	

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

代码语言:javascript
复制
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检验所写的程序语法正确性,无语法错误

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

全部代码如下 

代码语言:javascript
复制
	.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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WinMIPS64的IO方法输出hello world
  • 冒泡排序
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档