计算机系统3实验一——WinMIPS64模拟器实验

目录

零、特别鸣谢

一、前言

二、Hello World!

1、代码

2、运行结果

 三、编写排序算法

1、代码

2、运行结果


零、特别鸣谢

该实验的竣工与深圳大学19级曹老板关系颇深,在此特别感谢曹老板的倾情指导!

一、前言

能进到这篇博文的同学想必手头也拿到了作业的资料,这里废话我就不再赘述了,该实验主要是编写一个排序算法,下面直入主题。

二、Hello World!

1、代码

.data
CONTROL:	.word32 0x10000
DATA:   	.word32 0x10008
STR: 		.asciiz "Hello World!\n"  # the string to print

.text
main1:
ld r10,CONTROL(r0)
ld r11,DATA(r0)

# 输出“STR:Hello world!”
daddi r19,r0,STR
daddi r18,r0,4
sw r19,0(r11)
sw r18,0(r10)

halt

2、运行结果

 三、编写排序算法

1、代码

.data
array:		.word 9,8,7,6,5,4,10,23,12,100
STR1:		.asciiz "before sort the array is: \n"
STR2:		.asciiz "after sort the array is: \n"
CONTROL:	.word32 0x10000
DATA:   	.word32 0x10008
			.space 64
sp:			.word32 0

.text
main:
	ld r1,CONTROL($zero) # 获取0x10000和0x10008
	ld r2,DATA($zero)	
	
	daddi r0,$zero,0
	daddi r3,r0,STR1  # 输出str1
	daddi r4,r0,4
	sd r3,0(r2)
	sd r4,0(r1)

	daddi r3,$zero,0
print1:
	ld r4,array(r3)
	sd r4,0(r2)     # 数组首位的值存入地址 0
	daddi r5,$zero,2    
	sd r5,0(r1)
	daddi r3,r3,8
	daddi r4,r3,-80 # 输出10个数,每个是8个字节,所以是要减80
	beqz  r4,print_end1
	j print1
	
print_end1:  
	daddi r0,$zero,0
	daddi r3,r0,STR2  # 输出str2
	daddi r4,r0,4
	sd r3,0(r2)
	sd r4,0(r1)
	
	daddi $sp,$zero,sp  # stack pointer
	daddi r5,$zero,array  # r5: save the address of array
	daddi r6,$zero,10  # r6: save the length of array 
	jal sort

swap:
	dsll r6,r6,3 # r6*8
	dadd r11,r6,r5 # r11为当前数组地址
	ld r12,0(r11)
	ld r13,8(r11)
	sd r12,8(r11)
	sd r13,0(r11)
	jr $ra
	
sort:
	daddi $sp,$sp,-64
	sd $ra,0($sp)
	sd r7,8($sp) 
	sd r8,16($sp) 
	sd r9,24($sp) 
	sd r10,32($sp) 
	sd r11,40($sp) 
	sd r12,48($sp)
	sd r13,56($sp)

	dadd r8,r6,$zero  # length(这里发现$zero相当于一个寄存器)
	daddi r9,$zero,1   # i=1
	j mid1
loop1:	
	daddi r10,$zero,0  # j=0
	j mid2
loop2:
	dsll r7,r10,3 # r10*8,即j*8
	dadd r7,r7,r5 # r7为当前数组指针指向的地址
	ld r11,0(r7)
	ld r12,8(r7)
	slt r13,r12,r11 # 如果r12<r11,则r13=1
	beq r13,$zero,NotSwap
	dadd r6,$zero,r10 #r6=j
	jal swap
NotSwap:
	daddi r10,r10,1 #j++
mid2:
	dadd r3,r9,r10   # i+j
	bne r3,r8,loop2  # i+j!=length,即j<len-i
	daddi r9,r9,1	# i++
mid1:
	bne r8,r9,loop1 # i!=len, 即i<len时
	
sort_end:
	ld $ra,0($sp)
	ld r7,8($sp)
	ld r8,16($sp)
	ld r9,24($sp)
	ld r10,32($sp)
	ld r11,40($sp) 
	ld r12,48($sp)
	ld r13,56($sp)
	daddi $sp,$sp,64
	
	daddi r3,$zero,0
print2:
	ld r4,array(r3)
	sd r4,0(r2)     # 数组首位的值存入地址 0
	daddi r5,$zero,2    
	sd r5,0(r1)
	daddi r3,r3,8
	daddi r4,r3,-80 # 输出10个数,每个是8个字节,所以是要减80
	beqz  r4,ishalt
	j print2
ishalt:
halt


# jal Index: 跳转到子程序的地址并且把当前位置所在的下一条
#             指令位置存入 ra 寄存器中,以用于子程序执行完后的返回 

		

对应C语言冒泡排序:

2、运行结果

以上

祝好

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕飞雨的头发不能秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值