MIPS课程实验报告(斐波拉契数列)

斐波拉契数列:
斐波拉契数列为1、1、2、3、5、8、13、21……此数列从第3项开始,每一项都等于前两项之和。
设计思想:该数列可通过迭代或者递归的方式完成,本人采用迭代,首先,输入一个整数num,代表一共需要打印的项数,当num1或num2时,直接打印结果,不需要通过计算;当num>2时,先打印前两项的结果,再计算后面第3、4、5……项的结果并打印,该过程则通过循环实现。

下面是C++、伪代码、对照表和MIPS汇编源代码:

#include <iostream>
using namespace std;
int main()
{
	int num;		//数组长度
	cin>>num;
	int *array=new int[num]; //长度为 num 的数组
	for(int i=0;i<num;i++)
		cin>>array[i];    //循环输入数组元素
	
	int temp;		//临时数据储存 
	for(int i=0;i<num-1;i++)		//外层,进行num-1 次比较 
		for(int j=0;j<num-i-1;j++)	//内层,进行num-i-1次比较,每个元素的比较次数 
		{
			if(array[j]>array[j+1]){//按升序排序 
				temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	
	for(int i=0;i<num;i++)			//输出排序后结果 
		cout<<array[i]<<" ";
	
	delete []array;		
	return 0;
}

下面是汇编伪代码、代码:

###################	
# main:cout<<"Please input the array_lenth:"
#	cin>>t8
#	cout<<"Please input values:"
#	for(t7=0;t7<t8;t7++)
#	{
#	cin>>array[t7]
#	}
#	for(t7=0;t7<t8-1;t7++)
#	    for(t9=0;t9<t8-t7-1;t9++)
#		if(t2>t3)
#		{
#		 temp=t2;
#		 t3=t2;
#		 t2=temp;
#		}
#	for(t7=0;t7<t8;t7++)
#	    cout<<array[t7]<<" ";
#end:
##################################################################################
# 程序中使用的寄存器:
# t6:存放数组首地址
# t7:计数器,i
# t8:用于存放数组大小,num
# t9:计数器,j
# t0--t4:计算中用于存放数据
# t2: array[j]
# t3: array[j+1]
####################################################################################

	.data
array:	.space 1024			#分配数组空间
message:
	.asciiz "\nPlease input the array_lenth:"	#提示符:输入数组长度
prompt:	.asciiz "\n Please input values:"		#提示符:输入待排序数据
result:	.asciiz "\nThe result is;"			#提示符:输出排序后结果
kg:	.asciiz " "					#空格,用于分隔结果
	.text
	.globl main
main:	la $t6,array			#存数组首地址
	move $t7,$zero			#初始化$t7,用于循环记数
	move $t9,$zero			#排序时的内层循环变量
	
	la $a0,message
	li $v0,4
	syscall				#输出提示信息(数组长度)
	
	li $v0,5
	syscall
	move $t8,$v0			#输入数组长度 t8 = num
	
	la $a0,prompt
	li $v0,4
	syscall				#输出提示信息,准备输入数组
	
input:	li $v0,5
	syscall				#输入数组元素
	
	move $t0,$t7
	mul $t0,$t0,4			#计算数组下标(偏移值)
	
	addu $t1,$t0,$t6		#找到数组下标
	sw $v0,0($t1)			#将数据存入数组
	
	addi $t7,$t7,1			#下标 i++
	blt $t7,$t8,input		#循环输入num个数据
	move $t7,$zero			#计数器置0,i=0
	
loop1:	move $t9,$zero			#每次执行外层循环都将内层循环变量置 0

loop2:					
	move $t0,$t9
	mul $t0,$t0,4			#计算下标偏移值
	addu $t1 ,$t0,$t6
	
	lw $t2,0($t1)			#获取 data[j]
	
	addi $t0,$t9,1
	mul $t0,$t0,4
	addu $t4,$t0,$t6
	lw $t3, 0($t4)			#获取a[j+1]
	
	ble $t2,$t3,skip		#如果a[j]<a[j+1],跳转到skip进行处理
	
	sw $t3,0($t1)			#否则直接交换两者的值
	sw $t2,0($t4)
	
skip:	addi $t9,$t9,1			

	move $t0,$t9			# t0=j
	
	sub $t1,$t8,$t7			#num-i-1
	addi $t1,$t1,-1
	
	blt $t0,$t1,loop2		#内层循环判断
	
	addi $t7,$t7,1			#外层循环 i++
	
	sub $t2,$t8,1			#判断外层循环是否结束,i<num-1
	blt $t7,$t2,loop1
	
output:	la $a0,result			#输出提示符,输出排序后结果
	li $v0,4
	syscall
	
	move $t7,$zero			# i=0
	
print:	move $t0,$t7			#获取排序后的数组元素
	mul $t0,$t0,4
	addu $t1,$t0,$t6
	lw $a0,0($t1)
	
	li $v0,1			#打印获取的数组元素
	syscall
	
	la $a0,kg		#用空格将结果分开输出
	li $v0,4		#系统调用号打印字符
	syscall
	
	addi $t7,$t7,1		#i++
	blt $t7,$t8,print	#循环输出排序结果
	
	li $v0,10		#程序结束
	syscall

当然,我采用迭代的方法,但是并没有给出溢出错误提示,有兴趣的伙伴可以自己看看,加上!

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拜见老天師

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

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

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

打赏作者

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

抵扣说明:

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

余额充值