mips冒泡排序docx.docx
《mips冒泡排序docx.docx》由会员分享,可在线阅读,更多相关《mips冒泡排序docx.docx(9页珍藏版)》请在冰豆网上搜索。
mips冒泡排序docx
mips冒泡排序
《计算机组成原理实验》
实验报告
(实验一)
学院名称
:
专业(班级)
:
学生姓名
:
学号
时间
:
年
月
日
成绩
:
实验一
:
MIPS汇编语言程序设计实验
一.实验目的
1.初步认识和掌握MIPS汇编语言程序设计的基本方法;
2.熟悉PCSpim模拟器的使用。
二.实验内容
从键盘输入10个无符号字数或从内存中读取10个无符号字数并从大到小进行排序,排序结果在屏幕上显示出来。
三.实验器材
电脑一台,PCSpim仿真器软件一套。
四.实验过程与结果
1排序算法:
冒泡排序
2算法原理:
冒泡排序算法的运作如下:
(从前往后)
(1)比较相邻的元素。
如果第一个比第二个小,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最小的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3c++代码:
1.#include
2.using namespace std;
3.
4.void swap(int& a, int& b)
5.{
6. int tem = a;
7. a = b;
8. b = tem;
9.}
10.
11.int main()
12.{
13. int num[10];
14. int i, j;
15. for (i = 0; i < 10; ++i)
16. cin >> num[i];
17. for (i = 0; i < 10; ++i)
18. {
19. for (j = 0; j < 9 - i; ++j)
20. {
21. if (num[j] < num[j + 1])
22. swap(num[j], num[j + 1]);
23. }
24. }
25. for (i = 0; i < 10; ++i)
26. cout << num[i] << ' ';
27. cout << endl;
28. return 0;
29.}
五.实验心得
这次实验是我第一次使用汇编语言设计程序,在这个过程中我碰到了很多问题。
第一个问题发生在我开始尝试写代码时,因为对汇编语言不熟悉,所以在将c++代码中的循环语句编译成汇编时经常思路中断,代码的顺序经常出错。
最后的解决方法是将for循环拆分成几条不同的语句,确定它们的执行顺序之后在逐条翻译。
在解决程序的语法错误之后,为了解决剩下的bug,我将程序由对长度为10的数组进行排序改为对长度为5的数组进行排序,在解决了几个bug之后才将程序中数组的长度改回10.
第一个bug发生在类似下面这条语句中:
1. addi $t1, $t1, 4
在程序中,t1是一个用于指向数组中某个元素的指针,在完成对该元素的操作后,指针应指向下一个元素。
因为一个int数据占用4个字节的空间,所以立即数应该为4。
在最初的代码中,我在这条指令中使用的立即数是1,这使得指针不能顺利修改。
我在程序中发现的第二个bug与下面的代码有关:
1.swap:
2. lw $t6, 0($t1)
3. lw $t7, 0($t5)
4. sw $t6, 0($t5)
5. sw $t7, 0($t1)
在这段代码中,寄存器t1和t5存储的是数组中两个需要交换的元素的地址,在修改前的代码中,我忽略了这一点,受c++的习惯影响,我最初写的代码如下:
1.swap:
2. move $t6, $t1
3. move $t1, $t5
4. move $t5, $t6
在这段代码中,被修改的只是寄存器中的地址而不是该地址所指向的数据,因此程序报错。
以上是我在此次实验中的心得。
【程序代码】
1.##############################
2.# bubble sort #
3.##############################
4.
5..data
6. array:
7. .space 40
8. sperate:
9. .asciiz " "
10. endl:
11. .asciiz "\n"
12.
13..text
14..globl main
15.
16.main:
17. # 声明数组和计数器 i j
18. la $t0, array
19. move $t1, $t0
20. move $t2, $zero
21. move $t3, $zero # t2(i),t3(j)
22.
23. # 输入数据
24. input:
25. li $v0, 5
26. syscall
27. sw $v0, 0($t1) # 存入数据
28.
29. addi $t1, $t1, 4
30. addi $t2, $t2, 1 # 递增计数器
31. slti $s0, $t2, 10
32. bnez $s0, input
33.
34. # 第一层循环
35. move $t2, $zero # 计数器初始化
36. firstLoop:
37. slti $s1, $t2, 9
38. beqz $s1, output # 结束第一层循环
39.
40. move $t3, $zero
41. move $t1, $t0
42. secondLoop:
43. addi $t4, $zero, 9
44. sub $t4, $t4, $t2 # 求 9-i
45. slt $s2, $t3, $t4
46. beqz $s2, toFirstLoop
47.
48. # 比较大小
49. addi $t5, $t1, 4
50. lw $t6, 0($t1)
51. lw $t7, 0($t5)
52. slt $s3, $t6, $t7
53. bnez $s3, swap
54.
55. addi $t1, $t1, 4
56. addi $t3, $t3, 1 # 递增计数器j
57.
58. j secondLoop
59.
60. # 交换
61. swap:
62. lw $t6, 0($t1)
63. lw $t7, 0($t5)
64. sw $t6, 0($t5)
65. sw $t7, 0($t1)
66.
67. addi $t1, $t1, 4
68. addi $t3, $t3, 1 # 递增计数器
69.
70. j secondLoop
71.
72. # jump to first loop
73. toFirstLoop:
74. addi $t2, $t2, 1
75. move $t1, $t0
76. j firstLoop
77.
78. output:
79. # 计数器归零
80. move $t1, $t0
81. move $t2, $zero
82.
83. print:
84. slti $s0, $t2, 10
85. beqz $s0, exit
86.
87. lw $a0, 0($t1)
88. li $v0, 1
89. syscall
90.
91. lw $a0, sperate
92. li $v0, 4
93. syscall
94.
95. addi $t1, $t1, 4
96. addi $t2, $t2, 1
97. j print
98.
99. exit:
100. lw $a0, endl
101. li $v0, 4
102. syscall
103.
104. li $v0, 10
105. syscall