mips冒泡排序docx.docx

上传人:b****7 文档编号:26032638 上传时间:2023-06-17 格式:DOCX 页数:9 大小:38KB
下载 相关 举报
mips冒泡排序docx.docx_第1页
第1页 / 共9页
mips冒泡排序docx.docx_第2页
第2页 / 共9页
mips冒泡排序docx.docx_第3页
第3页 / 共9页
mips冒泡排序docx.docx_第4页
第4页 / 共9页
mips冒泡排序docx.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

mips冒泡排序docx.docx

《mips冒泡排序docx.docx》由会员分享,可在线阅读,更多相关《mips冒泡排序docx.docx(9页珍藏版)》请在冰豆网上搜索。

mips冒泡排序docx.docx

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  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1