mips汇编:冒泡排序

没怎么使用mips汇编,在此记录一下。对于过多的使用耗时最长的lw、sw感到效率不高,但是对于存在内存中的数组好像又没办法(寄存器数组?)不知道各位能否给出建议。

先写出C语言,然后翻译成mips,C语言:

#include<stdio.h>


void bubbleSort(int a[],int n)
{
	int t=0;
	for(int j=0;j<n-1;j++)//进行n-1次冒泡
	{
		for(int i=0;i<n-1-j;i++)
		{
			if(a[i]>a[i+1])
			{
				t=a[i+1];
				a[i+1]=a[i];
				a[i]=t;
			}
		 } 
	}
}
int main()
{
	int a[]={5,3,1,2,4};
	int n=sizeof(a)/sizeof(int);
	bubbleSort(a,n);
	for(int i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
 } 

MIPS:

##
######## by mrbone
####     bubbleSort
###      08-28-2018
#######################

#########  text segment  ##############
        .text
        .globl main
main:
	la	$s0,array		#数组起始地址	
	addi	$s1,$0,5		#五个元素 n=5
	move	$t0,$s0			#t0数组指针
	move	$t1,$0			#t1计数
	#输入数字
inputNum:
        li    $v0,   4         	#打印字符串
        la    $a0,   msg1
        syscall 
        li    $v0,   5          	#输入数字
        syscall
        sw	$v0,0($t0)		#存到数组中
	addi 	$t0,$t0,4		#指针后移
	addi	$t1,$t1,1		#记数+1
	blt	$t1,$s1,inputNum	#未满5次则跳转
	#开始排序
	subi	$s2,$s1,1		# n-1 冒泡n-1次
	
	move	$t1,$0			#外层变量j初始化
forExternal:
	move	$s3,$s2
	sub	$s3,$s3,$t1		# $s3为内层遍历控制 n-1-j
	move	$t2,$0			#内层变量i初始化
	move	$t0,$s0			#数组指针初始化
	addi	$t6,$t0,4		#$t6为辅助数组指针 便于交换
forInternal:
	#比较 交换 $t4 $t5暂存两个元素 
	lw	$t4,0($t0)		#取相邻值
	lw	$t5,0($t6)
	ble	$t4,$t5,next		# 小于等于不必交换则跳next
	sw	$t4,0($t6)		# 否则直接交叉lw完成交换
	sw	$t5,0($t0)
next:
	addi	$t0,$t0,4		#指针后移
	addi	$t6,$t0,4		#辅助指针后移
	
	addi	$t2,$t2,1		# i++
	blt	$t2,$s3,forInternal	#i<n-1-j
	
	addi	$t1,$t1,1		# j++
	blt	$t1,$s2,forExternal	# j<n-1?

	#输出结果
	move	$t1,$0			#计数
	move	$t0,$s0			#数组指针
printNum:
	li	$v0,1			#输出数字
	lw	$a0,0($t0)
	syscall
	li	$v0,4			#空格隔开
	la	$a0,space
	syscall
	
	addi	$t0,$t0,4		#指针后移
	addi	$t1,$t1,1		#计数+1
	blt	$t1,$s1,printNum

############### data segment   #####
       .data
array: .space  20			#放5个数字 一个4bytes
msg1:   .asciiz  "input number:\n"
space:	.asciiz  " "

## end of file

猜你喜欢

转载自blog.csdn.net/mrbone11/article/details/82153928
今日推荐