没怎么使用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