MIPS汇编语言实现冒泡排序

题目要求:键盘输入10个无序无符号整数,实现降序输出。

思路:

    首先,写出对应的C++代码,实现排序功能,为方便MIPS指令运行,我将冒泡排序做了一点改进:每次二重循环下标都从0开始,这样就无需记录当前数组移动的下标位置,方便许多。

    其次,MIPS设计的重点我认为在循环的跳转上,如何递增变量,如何跳转到相应的循环需要仔细设计。我将数组的重置,j = 0放在第一重循环中,然后进行判断i<10,若真,则进入第二重循环,二重循环中检测到j == 9时进入相应的模块将i++,再跳转到第一重循环中,如此即可实现排序所需的两重循环的切换。

    最后输出前需将对应的计数器i归零,循环输出结果和间隔符,就可以得到结果。

程序流程图:

流程图

运行结果:

结果

MIPS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
.data
.align 2
array: .space 40 # 10 integers
seperate: .asciiz " "
inputMessage: .asciiz "Please enter 10 numbers:\n"

.text
.globl main
main:
la $a0, inputMessage
li $v0, 4
syscall
la $t0, array
addi $t1, $zero, 0 # i
addi $t2, $zero, 0 # j
add $t5, $t0, $zero # head of pointers
addi $t6, $zero, 10 # constant
addi $t7, $zero, 9

addi $t1, $zero, 0

inputNumber:
li $v0, 5
syscall
sw $v0, 0($t0)
addi $t0, $t0, 4 # array++
addi $t1, $t1, 1 # i++
blt $t1, $t6, inputNumber # i<10


addi $t1, $zero, 0 # i = 0

firstLoop:
la $t5, array # t5 = array[0]
addi $t2, $zero, 0 # j = 0
blt $t1, $t6, secondLoop # i < 10, secondLoop

beq $t1, $t6, init # i == 10, init

secondLoop:
beq $t2, $t7, nextLoop # j == 9, nextLoop
lw $t3, 0($t5)
lw $t4, 4($t5)
blt $t3, $t4, swap
addi $t5, $t5, 4
addi $t2, $t2, 1 # j++
j secondLoop

nextLoop:
addi $t1, $t1, 1 # i++
j firstLoop

swap:
sw $t3, 4($t5)
sw $t4, 0($t5)
addi $t5, $t5, 4
addi $t2, $t2, 1 # j++
j secondLoop

init:
la $t0, array # t0 = array[0]
addi $t1, $zero, 0 # i = 0


printResult:
lw $a0, 0($t0)
li $v0, 1
syscall

la $a0, seperate
li $v0, 4
syscall
addi $t0, $t0, 4
addi $t1, $t1, 1
blt $t1, $t6, printResult

li $v0, 10
syscall

C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int main(){
int arr[10] = {0};
int i = 0, j = 0, k = 0, temp = 0;
for(i = 0;i < 10;i++){
cin >> arr[i];
}
for(i = 0;i < 10;i++){
for(j = 0;j < 9;j++){
if(arr[j] < arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int t = 0;t < 10;t++){
cout << arr[t] << " ";
}
cout << endl;
return 0;
}

补充说明:

若要实现自己定义输入的数字数,则只需在 .main 下添加一句:

1
2
3
li $v0, 5
syscall
sw $v0, 0($t6)

同时, t7 的值也要改为:

1
addi $t7 $t6 -1

array 的size也要足够大。

同理,若要实现 升序 ,只需将 secondLoop 中的第四句改为:

1
blt $t4 $t3 swap

即可实现效果啦。

分享到 评论