四川大学微机原理冒泡法排序实验报告
冒泡排序(实验报告)
一、实验目的和要求理解和掌握冒泡排序技术,使用C语言根据相应算法编写一个程序,实现冒泡排序。
要求仔细阅读下面的内容,编写C程序,上机通过,并观察其结果,写出实验报告书。
二、实验内容和原理内容:用冒泡排序对顺序存储的长度为10的无序线性表排序。
原理:首先,从表头开始往后扫描线性表,依次比较相邻两个元素,若前面的元素大于后面的元素,将它们交换。
然后,从后往前扫描后面的线性表,依次比较相邻两个元素,若后面的元素大于前面的元素,将它们交换。
对剩下的线性表重复上述过程,直到剩余表为空。
此时的线性表为有序。
三、主要仪器设备计算机一台四、实验主程序#include<stdio.h>void bub(int a[],int n);int main(void){inta[10]={456,1564,1231,44,1,32,78,15,3,6 56},i;for(i=0;i<10;++i)printf("%d ",a[i]);printf("\n");bub(a,10);for(i=0;i<10;++i)printf("%d ",a[i]);printf("\n");getchar();return 0;}void bub(int a[],int n){int i,j,k,m,temp;k=0;m=n-1;while(k<m){j=m;m=0;for(i=k;i<j;++i)if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;m=i;}j=k;k=0;for(i=m;i>j;--i)if(a[i]<a[i-1]){temp=a[i];a[i]=a[i-1];a[i-1]=temp;k=i;}}}实验结果五、实验心得通过实验学习,我理解了冒泡排序的算法,并实现了用c语言编写程序,提高了我的编程能力,受益匪浅。
微机原理实验报告冒泡法对数据排序8页
微机原理实验报告冒泡法对数据排序8页
实验目的:通过对冒泡法进行实现,了解算法的实际应用,并且掌握编程语言的基本
技巧。
实验原理:
冒泡排序是一种简单的排序方法,它的基本思想就是通过不断交换相邻的元素,将较
小的元素交换到前面,较大的元素交换到后面,从而将整个数列按从小到大(或从大到小)的顺序进行排列。
实验步骤:
(1)首先,输入需要排序的数据,将这些数据依次存储在数组中。
(2)然后,对这个数组进行冒泡排序操作。
具体的操作是:从数组的第一个元素开始,依次比较相邻两个元素的大小关系,如果后面的元素小于前面的元素,就将它们交换位置,直到将整个数组排列好为止。
(3)最后,输出排列好的数据。
实验代码:
2. 对这个数组进行冒泡排序操作。
实验结果:
输入需要排序的 10 个整数:
5 2 4 7 9 1 3 8
6 0
冒泡排序后的结果为:
0 1 2 3 4 5 6 7 8 9
实验分析:
通过本次实验,我们成功地实现了冒泡法对数据排序的操作。
在程序的实现过程中,
我们利用了C语言中的数组和循环结构等基本语言要素,完成了对数组中的数据进行排序
的操作。
通过本次实验,我们深入了解了算法的实际应用,掌握了编程语言的基本技巧,
对于今后的学习和实践具有重要的意义。
四川大学微机原理实验报告
《微机原理及接口技术实验报告》学院:电气信息学院班级: 109班老师:罗江陶学号: 1143031270姓名:实验一汇编语言程序的上机步骤一、实验目的:1、了解汇编语言程序的执行流程。
2、熟悉和使用DEBUG调试工具,分析和读懂一些及硬件相关的小程序。
3、通过对程序的分析,理解计算机程序的执行过程。
4、了解并逐步熟悉汇编语言的编辑方法及特点.5、复习8086汇编语言的段结构、常用的指令及伪指令、存储空间的分配等。
6、掌握汇编语言的编辑、汇编及连接的过程。
7、了解并逐步掌握运用DEBUG进行调试汇编语言程序二、实验内容:以文件名为1.asm源程的序为例,学习汇编语言的上机步骤。
汇编语言程序MASM软件由编辑器,汇编MASM.EXE程序,连接LINK.EXE程序以及DUEBUG.EXE调试程序四个部分组成。
汇编语言编制完成后,在计算机上的操作过程就分为四个阶段。
1. 编辑:首先输入源程序:在记事本里录入,注意在保存时文件格式必须选择所有文件,文件后缀名为.ASM, 即保存时文件名为XXX.asm。
2.用汇编程序MASM.Exe对源程序.ASM文件汇编,生成目标文件.OBJ:双击MASM软件中的MASM.Exe文件框,在命令行后键入源程序名XXX.asm,(如果源程序及MASM软件在同一路径下,可以只键入文件名,而不要后缀)3.连接LINK.EXE双击MASM软件中的LINK.Exe文件框,在命令行后键入目标文件名XXX.OBJ(如果源程序,目标文件及MASM软件在同一路径下,可以只键入文件名,而不要后缀)如果连接没有错误,就会产生一个XXX.EXE的可执行文件,如果.OBJ文件有错误,连接时会指出错误的原因。
4.运行和调试DEBUG.exe运行可执行文件,即双击XXX.EXE文件框即可,或在DOS下运行此程序,E:\XXX.EXE。
三、程序流程图:四、程序清单及注释:DATA SEGMENTNUM1 DB 35,35HNUM2 DW 35,35HNUM3 DB 4 DUP (34,3 DUP (34H))NUM4 DB '34AB'NUM5 DW '34','AB'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,OFFSET NUM1MOV AL,[BX]MOV BX,OFFSET NUM5MOV AX,[BX]MOV AH,4CHINT 21HCODE ENDSEND START五、运行结果:将以上程序在笔记本中保存为xueyuan1.ASM 编译后显示编译成功:运行结果如下:运行可执行文件出现此界面后“闪退”六、实验心得:通过本次实验,我了解了一个汇编程序在计算机上的执行步骤,如何实现一个汇编程序的编辑、连接、运行。
冒泡法排序实验报告
冒泡法排序实验报告一、实验任务实现N个16位无符号整数的排序,核心程序使用汇编语言实现。
二、程序算法冒泡法:若有n个数需要排序,则第一次遍历n个数,将x[0]与x[1]相比,若x[0]>x[1],则两数交换位置,若x[0]<x[1],则不作任何调整;然后将x[0]与x[2]相比较,若x[0]>x[2],则两数交换位置;若x[0]<x[2],则不作任何调整;依此类推,直到x[0]与x[n]比较完毕为止。
接着第二次遍历n-1个数,将x[1]与x[2]相比,若x[1]>x[2],则两数交换位置,若x[0]<x[1],则不作任何调整;一直到x[1]与x[n]比较完毕为止。
最后一直到只需要遍历2个数,比较调整完毕就可以得到数组从小到大的排列次序,算法在每次遍历时使最小的数象气泡一样冒到顶端,在经历n-1次遍历以后即可得到结果。
三、源程序及注释//冒泡排序法#include <iostream.h>int main(int argc, char* argv[]){unsigned short int x[33]; //排序个数上限为33个unsigned short int i,j,n;unsigned short int a,b;//提示输入排序个数cout<<"Please input the count of numbers: \n";cin>>n;//提示输入需要排序的各个数cout<<"Please input the numbers: \n";x[0] = 0;for(i=1;i<n+1;i++) //初始化需要排序的数组x[n]cin>>x[i];for(i=0;i<=n;i++) //冒泡法排序{for(j=n;j>=i+1;j--) //每次遍历n-i个数{a = x[j-1];b = x[j];_asm{mov ax,a //将一个数读入到axcmp ax,b //比较两数大小jc exit //若a小则跳出xchg ax,b //若b小则两数交换次序mov a,axexit: NOP}x[j-1] = a; //保存两数排序结果x[j] = b;}}//输出排序结果,按从小到大排列cout<<"The Result is : \n";for(i=1;i<n+1;i++)cout<<x[i]<<' ';cout<<'\n';return 0;}四、实验结果。
冒泡排序计算实验报告
一、实验目的1. 理解冒泡排序算法的基本原理和实现过程。
2. 分析冒泡排序算法的时间复杂度和空间复杂度。
3. 通过实验验证冒泡排序算法在不同数据规模下的性能表现。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发环境:PyCharm三、实验内容1. 冒泡排序算法的实现2. 冒泡排序算法的性能测试3. 结果分析四、实验步骤1. 实现冒泡排序算法```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr```2. 生成测试数据```pythonimport randomdef generate_data(n):return [random.randint(0, 10000) for _ in range(n)]```3. 测试冒泡排序算法性能```pythondef test_bubble_sort():data_sizes = [100, 1000, 10000, 100000]for size in data_sizes:data = generate_data(size)sorted_data = bubble_sort(data.copy())assert sorted_data == sorted(data), "排序结果错误"print(f"数据规模:{size}, 排序耗时:{time.time() - start_time:.4f}秒")start_time = time.time()test_bubble_sort()print(f"实验总耗时:{time.time() - start_time:.4f}秒")```五、结果分析1. 冒泡排序算法的时间复杂度分析冒泡排序算法的时间复杂度主要取决于两层循环的执行次数。
实验报告_冒泡排序法(3篇)
第1篇一、实验目的1. 理解冒泡排序算法的基本原理和操作步骤。
2. 掌握冒泡排序算法的实现方法。
3. 分析冒泡排序算法的时间复杂度和空间复杂度。
4. 通过实验验证冒泡排序算法的效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验原理冒泡排序是一种简单的排序算法,其基本思想是通过多次比较和交换相邻元素,将待排序的序列变为有序序列。
冒泡排序算法的基本步骤如下:1. 从第一个元素开始,相邻的两个元素进行比较,如果它们的顺序错误(即第一个元素大于第二个元素),则交换它们的位置。
2. 重复步骤1,对相邻的元素进行比较和交换,直到整个序列的最后一个元素。
3. 第一轮排序完成后,最大的元素被放置在序列的最后一个位置。
4. 从第一个元素开始,对剩余的元素重复步骤1和步骤2,直到序列的倒数第二个元素。
5. 重复步骤3和步骤4,直到整个序列有序。
四、实验步骤1. 编写冒泡排序算法的C++代码,实现上述算法步骤。
2. 在主函数中创建一个待排序的数组。
3. 调用冒泡排序函数对数组进行排序。
4. 输出排序前后的数组,验证排序结果。
五、实验代码```cppinclude <iostream>using namespace std;// 冒泡排序函数void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}// 打印数组函数void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;}int main() {// 创建待排序的数组int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);// 打印排序前的数组cout << "排序前的数组:\n";printArray(arr, n);// 调用冒泡排序函数bubbleSort(arr, n);// 打印排序后的数组cout << "排序后的数组:\n";printArray(arr, n);return 0;}```六、实验结果与分析1. 运行实验程序,输出排序前后的数组,验证排序结果是否正确。
微机排序实验实验报告
一、实验目的1. 熟悉排序算法的基本原理和实现方法。
2. 掌握各种排序算法的性能特点。
3. 通过编程实现常见的排序算法,并进行性能测试和分析。
二、实验内容1. 实现以下排序算法:(1)冒泡排序(2)选择排序(3)插入排序(4)快速排序(5)归并排序2. 对生成的随机数据进行排序,并统计每种排序算法的运行时间。
3. 分析并比较各种排序算法的性能。
三、实验步骤1. 编写排序算法的代码。
(1)冒泡排序:通过比较相邻元素的大小,如果顺序错误则交换,重复这个过程,直到没有需要交换的元素。
(2)选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(3)插入排序:将未排序的数据元素插入到已排序的有序序列中,从而得到一个新的、有序的序列。
(4)快速排序:通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
(5)归并排序:将两个或两个以上的有序表合并成一个新的有序表。
2. 生成随机数据,并进行排序。
3. 使用计时器统计每种排序算法的运行时间。
4. 分析并比较各种排序算法的性能。
四、实验结果与分析1. 实验数据生成1000个随机数,范围在1到10000之间。
2. 实验结果(1)冒泡排序:运行时间约为0.002秒。
(2)选择排序:运行时间约为0.003秒。
(3)插入排序:运行时间约为0.004秒。
(4)快速排序:运行时间约为0.0005秒。
(5)归并排序:运行时间约为0.001秒。
3. 性能分析(1)冒泡排序、选择排序和插入排序属于O(n^2)复杂度的排序算法,其运行时间随着数据量的增加而迅速增加。
(2)快速排序和归并排序属于O(nlogn)复杂度的排序算法,其运行时间随着数据量的增加而逐渐增加,但增长速度较慢。
四川大学_微机原理与接口技术实验报告_冒泡法
《微机原理与接口技术实验报告》学院:学号:姓名:一、实验目的:1.理解各种指令的功能。
2.进一步学习程序的调试。
二、实验内容:1.编制程序,对这组数进行排序,并输出原数据及排序后数据;2.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化;3. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;4. 用学过的压栈PUSH和出栈POP指令,将平均值按位逐个输出(即输出263);5将平均值263转化为二进制串,并将这组二进制串输出。
6.所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。
DATAS SEGMENTVAR DW 300,250,280,240,260D1 DB 0DH,'YUAN SHU JU',0DH,0AH,'$'D2 DB 0DH,0AH,'PAI XU HOU',0DH,0AH,'$'D3 DB 0DH,0AH,'ZUI DA ZHI',0DH,0AH,'$'D4 DB 0DH,0AH,'ZUI XIAO ZHI',0DH,0AH,'$'D5 DB 0DH,0AH,'PING JUN ZHI',0DH,0AH,'$'D6 DB 0DH,0AH,'AN WEI SHU CHU',0DH,0AH,'$'D7 DB 0DH,0AH,'ER JIN ZHI SHU CHU',0DH,0AH,'$' DATAS ENDSSTACKS SEGMENTS DB 100 DUP(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:B: MOV AX,DATASMOV DS,AXMOV CX,5MOV DX,OFFSET D1 ;输出‘yuan shu ju’MOV AH,9INT 21HMOV SI,0CALL OUTP ;调用输出MOV DX,1AG: CALL SUBP ;调用冒泡法INC DXLOOP AGMOV CX,5MOV DX,OFFSET D2 ;输出‘PAI XU HOU’MOV AH,9INT 21HMOV SI,0CALL OUTP ;调用输出,输出排序后数据MOV DX,OFFSET D3 ;输出‘ZUI DA ZHI’MOV AH,9INT 21HMOV SI,8MOV BX,[SI]CALL OUTP2 ;输出最大值MOV DX,OFFSET D4 ;输出‘ZUI XIAO ZHI’MOV AH,9INT 21HMOV SI,0MOV BX,[SI]CALL OUTP2MOV DX,OFFSET D5 ;输出‘PING JUN ZHI’MOV AH,9INT 21HMOV BX,0 ;求平均值MOV DX,0ADD BX,[SI+2]ADD BX,[SI+4]ADD BX,[SI+6]MOV AX,BXMOV BX,3DIV BXMOV BX,AXPUSH BX ;BX入栈保护CALL OUTP2 ;输出平均值MOV DX,OFFSET D7 ;输出‘ER JIN ZHI SHU CHU’MOV AH,9INT 21HPOP BX ;BX出栈MOV CX,16ER: SHL BX,1 ;二进制循环输出/左移一位MOV DL,0ADC DL,0 ;通过加一加进位ADD DL,30HMOV AH,2 ;二进制输出INT 21HLOOP ERMOV AH,4CHINT 21HSUBP PROC ;子程序,冒泡法PUSH CX ;CX入栈保护INC CXMOV SI,0RECMP:MOV AX,VAR[SI] ;循环排序CMP AX,VAR[SI+2]JLE NOCHXCHG AX,VAR[SI+2]XCHG AX,VAR[SI]NOCH: INC SIINC SI ;SI自加二指向下一个数LOOP RECMPPOP CXRETSUBP ENDPOUTP PROC ;子程序,十进制转换成ASCII码PUSH DXPUSH CXCHANGE: MOV DX,0MOV AX,[SI]MOV BX,10DIV BXADD DX,30HPUSH DX ;堆栈压入最低位MOV DX,0DIV BXADD DX,30HPUSH DX ;堆栈压入中间位MOV DL,ALADD DL,30HMOV AH,2 ;输出最高位INT 21HPOP DX ;弹出并输出中位MOV AH,2INT 21HPOP DX ;弹出并输出高位MOV AH,2INT 21HADD SI,2 ;SI加二,指向下一个数MOV DL,0 ;输出空格MOV AH,2INT 21HLOOP CHANGE ;循环直至全部输出POP CXPOP DXRETOUTP ENDPOUTP2 PROC ;子程序2,十进制转换成ASCII码,不循环PUSH DXPUSH CXMOV DX,0MOV AX,BXMOV BX,10DIV BXADD DX,30HPUSH DXMOV DX,0DIV BXADD DX,30HPUSH DXMOV DL,ALADD DL,30HMOV AH,2INT 21HPOP DXMOV AH,2INT 21HPOP DXMOV AH,2INT 21HMOV DL,0MOV AH,2INT 21HPOP CXPOP DXRET OUTP2 ENDP CODES ENDSEND BEND START 五、运行结果:六、实验心得:(一)我认为程序编写最难的是总体思路的把握:怎样才能实现想要的功能,怎样以更简洁的程序实现想要的功能。
排序算法实验报告2:冒泡排序及选择排序(分割策略)
排序算法实验报告2:冒泡排序及选择排序(分割策略)1. 引言本实验旨在研究和分析冒泡排序和选择排序算法,并通过对比它们的性能来评估它们在排序过程中的效率和效果。
冒泡排序和选择排序都是经典的排序算法,它们在不同的场景下都有着广泛的应用。
2. 冒泡排序2.1 算法原理冒泡排序是一种通过比较和交换相邻元素来排序的算法。
它的基本思想是重复地遍历待排序序列,每次比较相邻的两个元素,并根据排序规则对它们进行交换,直到整个序列有序。
2.2 算法实现冒泡排序的算法实现可以分为以下几个步骤:1. 遍历待排序序列,从第一个元素开始,依次比较相邻的两个元素。
2. 如果相邻元素的顺序不符合排序规则,则交换它们的位置。
3. 继续遍历序列,重复以上步骤,直到整个序列有序。
2.3 算法性能冒泡排序的时间复杂度为O(n^2),其中n是待排序序列的长度。
它是一种稳定的排序算法。
3. 选择排序(分割策略)3.1 算法原理选择排序是一种通过选择最小(或最大)元素并将其放置到已排序序列的末尾(或开头)来排序的算法。
它的基本思想是将待排序序列划分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,并将其加入到已排序部分。
3.2 算法实现选择排序的算法实现可以分为以下几个步骤:1. 遍历待排序序列,先假定第一个元素为最小(或最大)元素。
2. 将该元素与未排序部分的元素依次比较,找到最小(或最大)的元素。
3. 将最小(或最大)元素与未排序部分的第一个元素交换位置,将其加入到已排序部分。
4. 继续遍历未排序部分,重复以上步骤,直到整个序列有序。
3.3 算法性能选择排序的时间复杂度为O(n^2),其中n是待排序序列的长度。
它是一种不稳定的排序算法。
4. 实验结果与分析通过对冒泡排序和选择排序的实验,我们得到了它们在不同规模的输入数据下的排序时间。
根据实验结果,我们可以发现:- 冒泡排序相对于选择排序来说,其性能较差。
在相同规模的输入数据下,冒泡排序的排序时间要长于选择排序。
微机原理及接口技术实验——冒泡法
微机原理及接口技术实验——冒泡法冒泡排序是一种简单的排序算法,其基本思想是通过重复比较相邻的两个元素,并将较大的元素交换到右侧,从而将最大的元素逐渐"冒泡"到最右侧。
这种算法得名于每次比较时较大元素"冒泡"到右侧的过程。
冒泡排序算法的步骤如下:1.比较相邻的两个元素。
如果第一个元素大于第二个元素,则交换它们的位置。
2.对每一对相邻元素进行同样的操作,从左往右依次进行,这样一轮比较下来,最大的元素将会移动到最右侧。
3.重复上述步骤,每次比较的次数减1,直到所有元素都排好序。
下面是一个使用冒泡排序算法的示例程序:```pythondef bubble_sort(arr):n = len(arr)for i in range(n-1):for j in range(n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]arr = [64, 34, 25, 12, 22, 11, 90]bubble_sort(arr)print(arr)```在上述示例程序中,我们定义了一个名为`bubble_sort`的函数,该函数接受一个列表作为参数,并对列表进行冒泡排序。
在外层循环中,我们迭代n-1次,其中n为列表的长度。
在内层循环中,我们通过比较相邻元素并交换它们的位置,将较大的元素"冒泡"到右侧。
通过多次迭代,最终实现将所有元素按从小到大的顺序排列。
除了基本的冒泡排序算法,我们还可以对其进行一些改进,以提升排序的效率。
例如,我们可以设置一个标志位`flag`来记录本轮是否进行了元素的交换。
如果本轮没有进行交换,说明列表已经排好序,可以提前结束循环。
这样可以减少无意义的比较操作,提高效率。
冒泡排序算法的时间复杂度为O(n^2),其中n为列表的长度。
在最坏情况下,即列表本身为逆序,需要进行n*(n-1)/2次比较和交换操作。
微机原理实验报告冒泡法对数据排序
实验内容:用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。
实验要求:1、编制程序,对这组数进行排序,并输出原数据及排序后数据;2、利用DEBUG调试工具,用D0命令,查瞧排序前后,内存数据的变化;3、去掉最大与最小的两个值,求出其余值的平均值,并输出最大值,最小值与平均值;4、用学过的压栈PUSH与出栈POP指令,将平均值按位逐个输出(即输出263);5.将平均值263转化为二进制串,并将这组二进制串输出。
6、所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。
程序代码:DATA SEGMENT ;定义数据段DT1 DW 300,250,280,240,260DT2 DB 'what five data input is',0DH,0AH,'$'DT3 DB 'what after rank is',0DH,0AH,'$'DT4 DB 'The max is',0DH,0AH,'$'DT5 DB 'The min is',0DH,0AH,'$'DT6 DB 'The average is',0DH,0AH,'$'DT7 DB 'show you the average one by one',0DH,0AH,'$'DT8 DB 'show you the average in binary form',0DH,0AH,'$'DT9 DB 0DH,0AH,'$'DT0 DB 'B',0DH,0AH,'$'N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;说明代码段、数据段STAT: MOV AX,DATAMOV DS,AXLEA DX,DT2 ;输出字符串MOV AH,09HINT 21HCALL ZIXU ;调用数据输出过程对数据进行排序:MOV CX,N-1 ;设置N-1轮比较次数MOV DX,1 ;比较轮次技术JM4:PUSH CXMOV CX,NSUB CX,DXLEA SI,DT1JM3:MOV AX,[SI]CMP AX,[SI+2]JLE JM2XCHG AX,[SI+2]XCHG AX,[SI]JM2:ADD SI,2LOOP JM3POP CXINC DXLOOP JM4输出排序后的顺序:LEA DX,DT3MOV AH,09HINT 21HCALL ZIXU输出最大值:LEA DX,DT4MOV AH,09HINT 21HLEA SI,DT1+8 ;排序后最后一个数就就是最大值MOV AX,[SI]CALL ZIXU1输出最小值:LEA DX,DT5MOV AH,09HINT 21HLEA SI,DT1 ;排序后第一个数就就是最小值MOV AX,[SI]CALL ZIXU1输出平均值:LEA DX,DT6MOV AH,09HLEA SI,DT1+2 ;去掉最大最小后的数求与MOV AX,[SI]ADD AX,[SI+2]ADD AX,[SI+4]MOV BX,3MOV DX,0DIV BX ;求其平均值MOV CX,AXCALL ZIXU1 ;调用输出程序输出把平均值分三位输出:LEA DX,DT7MOV AH,09HINT 21HMOV AX,CXMOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,AL ;输出平均值的第一位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HINT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,AL ;输出平均值的第二位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HPOP DXADD DX,30HMOV AH,2 ;输出平均值的第三位I NT 21HLEA DX,DT9MOV AH,09HINT 21H;以二进制位输出平均值LEA DX,DT8MOV AH,09HINT 21HMOV BX,CXMOV CX,16JM5:MOV DX,0SAL BX,1RCL DX,1ADD DX,30HMOV AH,02HINT 21H DEC CXJNZ JM5LEA DX,DT0MOV AH,09HINT 21HMOV AH,4CH ;返回DOSINT 21H;数据序列的输出写成一个过程:ZIXU PROCMOV CX,5LEA SI,DT1JM1:MOV AX,[SI]MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALINT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HADD SI,2LOOP JM1RETZIXU ENDP;当个数据输出过程:ZIXU1 PROC ;将数据的输出写成一个过程MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HRETZIXU1 ENDPCODE ENDSEND STAT调试中出现的一些问题:1.输入时不慎将字母O当数字0输入,结果导致了下面第5行提示的错误。
微机原理 冒泡排序实验报告含源程序
实验报告实验名称_ _冒泡排序实验_课程名称____ __ __微机原理_____________院系部:控计学院专业班级:信安1101学生姓名:陈茹君学号:1111290106同组人:实验台号:18指导教师:闫江毓成绩:实验日期:2014年5月9日华北电力大学一、实验目的掌握用汇编语言编写气泡排序程序的思路和方法,掌握字符和数据的显示方法。
二、实验内容从键盘输入5个有符号2位十进制数,将它转换成有符号二进制数,将结果送入内存中buff开始的单元中。
将这些数从大到小排序,并将排序结果显示在屏幕上。
三、实验步骤1.算法设计1)问题分析键盘输入子程序inword 出口:buff开始的单元,CX排序子程序sort:入口:buff开始的单元,CX;出口:buff开始的单元,CX显示子程序display:入口:AL2)绘出流程图2.详细设计1)变量定义及说明.databuff db -5,-43,-32,-22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,02)寄存器的使用及含义使用了al、ah、bl、bh、ax、bx、cx、di、si寄存器,都是用来存放数据,比较数据的大小,进行数据的值的转化和计算。
3)程序功能说明4)源程序清单.model small.data;buff db 20 dup(1)buff db -5,-43,-32,-22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.codestart:mov ax, @datamov ds, axcall inwordcall sortcall displaymov ax, 4c00hint 21hinword procpush axpush bxpush cxpush dxpush simov si, offset buffmov cx, 5read:mov ah, 01hint 21hmov ah, 10xor bh, bhcmp al, 2dhmov bl, 1mov ah, 01hint 21h pos:add bh, alsub bh, 30hmov ah, 01hint 21hcmp al, 20hje donesub al, 30hxchg bh, almov ah, 10mul ahadd bh, 30hjmp pos done:cmp bl, 1jne finishneg bhmov bl, 0 finish:mov [si], bhinc siloop readpop sipop dxpop cxpop bxpop axretendpsort procpush axpush cxpush sipush dimov bx, 4 first:mov al, [si]mov cx, bxmov di, si second:inc dicmp al, [di]jge nextxchg al, [di]mov [si], al next:loop secondinc sidec bxjnz firstpop dipop sipop cxpop bxpop axretendp display procpush axpush bxpush cxpush dxpush simov dl, 0dhmov ah, 02hmov dl, 0ahmov ah, 02hint 21hmov cx, 5mov si, offset buffmov dh, 10dis:test [si], 10000000bjz positivemov dl, 2dhmov ah, 02hint 21hneg [si] positive:mov al, [si]xor ah, ahdiv dhmov dl, aladd dl, 30hmov bh, ahmov ah, 02hint 21hmov dl, bhadd dl, 30hmov ah, 02hint 21hmov dl, 20hmov ah, 02hint 21hinc siloop dispop sipop dxpop cxpop axretendpend start四、调试结果及调试分析五、结论与心得我们不仅要学习书本上的知识,更要知识与实践相结合,多动手发现问题解决问题,学会举一反三、融会贯通。
冒泡排序的实验报告
一、实验目的1. 理解冒泡排序算法的基本原理;2. 掌握冒泡排序算法的实现方法;3. 分析冒泡排序算法的时间复杂度;4. 通过实验验证冒泡排序算法的效率。
二、实验原理冒泡排序是一种简单的排序算法,它通过重复遍历待排序的数列,比较每对相邻的项,并在顺序错误时交换它们的位置,直到没有需要交换的项为止。
由于排序过程中小数逐渐浮到前面,大数逐渐沉到后面,故得名冒泡排序。
冒泡排序的基本思想是:比较相邻的两个元素,如果它们的顺序错误(即前一个比后一个大),则交换它们的位置。
这样,每一轮遍历后,最大的元素就会被“冒泡”到数组的末尾。
重复此过程,直到整个数组排序完成。
三、实验步骤1. 准备实验材料:一组待排序的整数序列;2. 实现冒泡排序算法,包括以下步骤:a. 初始化一个布尔变量flag,用于标记是否发生了交换;b. 遍历数组,比较相邻的两个元素,如果顺序错误则交换它们的位置;c. 如果在某一轮遍历中没有发生交换,说明数组已经排序完成,退出循环;d. 重复步骤b和c,直到数组排序完成;3. 对排序结果进行验证,确保数组已正确排序;4. 记录冒泡排序算法的执行时间;5. 分析冒泡排序算法的时间复杂度。
四、实验结果与分析1. 实验数据(1)待排序数组:[5, 3, 8, 6, 2, 7, 4, 1](2)排序前数组:[5, 3, 8, 6, 2, 7, 4, 1](3)排序后数组:[1, 2, 3, 4, 5, 6, 7, 8]2. 实验结果冒泡排序算法对上述数组进行排序,经过8轮遍历后,数组已正确排序。
3. 实验分析(1)冒泡排序的时间复杂度分析冒泡排序的时间复杂度为O(n^2),其中n是待排序数组的长度。
原因如下:- 在最坏的情况下(即数组完全逆序),冒泡排序需要进行n-1轮遍历,每轮遍历需要比较n-1次,因此总比较次数为(n-1)+(n-2)+...+1,即(n-1)n/2,即O(n^2)。
- 在最好的情况下(即数组已经排序),冒泡排序在第一轮遍历后即可发现没有发生交换,此时只需进行一轮遍历,比较次数为n-1,即O(n)。
冒泡排序实习报告
一、实习背景随着计算机科学技术的不断发展,算法和数据结构在计算机编程中扮演着越来越重要的角色。
冒泡排序作为一种基础的排序算法,对于理解排序算法的原理和实现具有重要意义。
为了提高自己的编程能力和对数据结构的理解,我选择在实习期间进行冒泡排序项目的实践。
二、实习目的1. 理解冒泡排序算法的基本原理和实现过程;2. 掌握冒泡排序算法在不同编程语言中的实现;3. 通过实际操作,提高自己的编程能力和对数据结构的理解;4. 体验编程项目的完整流程,包括需求分析、设计、编码、测试和优化。
三、实习内容1. 冒泡排序算法原理冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐步“冒泡”到数组的末尾,从而实现数组的有序排列。
具体过程如下:(1)从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序错误(即第一个比第二个大),就交换它们的位置;(2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
这步做完后,最后的元素会是最大的数;(3)针对所有的元素重复以上的步骤,除了最后已经排序好的元素;(4)重复步骤1~3,直到排序完成。
2. 冒泡排序算法实现在实习过程中,我尝试使用Python、Java和C三种编程语言实现冒泡排序算法。
(1)Python实现```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j] return arr```(2)Java实现```javapublic class BubbleSort {public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}}```(3)C实现```cvoid bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n-1; i++) {for (j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}```3. 冒泡排序算法测试为了验证冒泡排序算法的正确性,我编写了测试代码,分别对Python、Java和C 三种语言的实现进行测试。
四川大学微机原理实验报告
微机原理实验报告学院:专业班级:姓名学号实验一 汇编语言编程基础汇编语言程序上机操作和调试训练一.功能说明运用8086汇编语言,编辑多字节非压缩型BCD 数除法的简单程序,文件名取为*.ASM 。
运用MASM ﹒EXE 文件进行汇编,修改程序中的各种语法错误,直至正确,形成*.OBJ 文件。
运用文件进行连接,形成*.EXE 文件。
仔细阅读和体会DEBUG 调试方法,掌握各种命令的使用方法。
运用DEBUG 。
EXE 文件进行调试,使用单步执行命令—T 两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D ,观察存储器数据段内数值。
再使用连续执行命令—G ,执行程序,检查结果是否正确,若不正确可使用DEBUG 的设置断点,单步执行等功能发现错误所在并加以改正。
二.程序流程图三.程序代码修改后的程序代码如下: DATA SEGMENTA DB 9,6,8,7,5 B DB 5C DB 5 DUP (0) N EQU 5 DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AXMOV ES,AXCLDLEA SI,ALEA DI,CMOV CX,NMOV AH,0LP1: LODSBAADDIV BSTOSBLOOP LP1MOV CX,NLEA DI,CLP2: MOV DL,[DI]ADD DL,30HMOV AH,2INT 21HINC DILOOP LP2MOV AH,4CHINT 21HCODE ENDSEND START四.实验感想和收获通过这次试验,我对微机原理上级试验环境有了初步的认识,可以较为熟练地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。
在这次试验中我也遇到了一些困难。
在刚开始我发现自己无法打开,计算机提示是由于版本不兼容。
我这才想起来我的操作系统是64位的,和该软件版本不兼容。
微机实验排序实验报告
一、实验目的1. 熟悉排序算法的基本原理和实现方法;2. 掌握冒泡排序、选择排序、插入排序等常用排序算法;3. 通过实验,加深对排序算法的理解,提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 冒泡排序2. 选择排序3. 插入排序四、实验原理1. 冒泡排序:冒泡排序是一种简单的排序算法,它重复地遍历待排序的序列,比较相邻的元素,如果它们的顺序错误就把它们交换过来。
遍历序列的工作是重复地进行,直到没有再需要交换,也就是说该序列已经排序完成。
2. 选择排序:选择排序是一种简单直观的排序算法。
它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
3. 插入排序:插入排序是一种简单直观的排序算法。
它的工作原理是:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
五、实验步骤1. 冒泡排序(1)定义一个函数,用于实现冒泡排序算法;(2)在主函数中,定义一个整数数组,并对其进行初始化;(3)调用冒泡排序函数,对数组进行排序;(4)打印排序后的数组。
2. 选择排序(1)定义一个函数,用于实现选择排序算法;(2)在主函数中,定义一个整数数组,并对其进行初始化;(3)调用选择排序函数,对数组进行排序;(4)打印排序后的数组。
3. 插入排序(1)定义一个函数,用于实现插入排序算法;(2)在主函数中,定义一个整数数组,并对其进行初始化;(3)调用插入排序函数,对数组进行排序;(4)打印排序后的数组。
六、实验结果与分析1. 冒泡排序实验结果:```原始数组:5 3 8 6 2排序后数组:2 3 5 6 8```分析:冒泡排序在最好情况下(已排序)的时间复杂度为O(n),在平均和最坏情况下(逆序)的时间复杂度为O(n^2)。
冒泡排序和快速排序实验报告
实验报告
实验名称实验三冒泡排序和快速排序
班级
学号
姓名
成绩
move++;
}
while(x[i]<=temp && j>i)
{
i++;
}
if(j>i)
{
x[j--]=x[i];
}
}
x[i]=temp;
kuaisu(x,left,i-1);
kuaisu(x,i+1,right);
}
【实验过程】(实验步骤、数据、分析)
实验步骤:
1)随机产生20位整数
2)输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。
1.冒泡排序
2.快速排序
3)纪录每种方法比较次数和移动次数
实验结果分析:
根据冒泡法和快速法输出地移动次数和比较次数可以看出,快速法的移动次数和比较次数要比冒泡法少许多。
因此,快速法是一种比冒泡法更好的排序法。
【结论】(结果)
冒泡法排序的结果的截图:
快速法排序的结果的截图:
【小结】
由于大一下学期学习C语言时,冒泡法和快速法都是重点内容,这次实验进行的比较顺利,没有遇到太多困难。
只是刚开始不知道怎样输出比较次数和移动次数,后来定义了两个全程变量,解决了这个问题。
另外,虽然实验说明上有怎样输出时间的语句,但是尝试了许多次还是没有成功。
先是提示变量类型错误,然后提示没有GetTickCount()函数。
最后只好没有输出时间,也没有比较两种方法的运行时间
指导教师评语及成绩:
成绩:指导教师签名:
批阅日期:。
川大微机上机实验报告(冒泡排序法)
上机目的:1、了解并逐步熟悉汇编语言的编辑方法及特点.2、复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。
3、掌握汇编语言的编辑、汇编及连接的过程。
4、了解并逐步掌握运用DEBUG进行调试汇编语言程序。
5、掌握循环结构程序的设计编程。
上机内容:用冒泡法对一组数300,250,280,240,260按从小到大的顺序排列。
提示:1、用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。
2、对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。
每一遍的排序由若干次邻元素的排序组成。
3、4遍排序中,邻元素的排序依次为4,3,2,1遍。
完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。
思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;2、对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;3、利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;4、去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;5、用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);6、用移位指令将平均值以二进制串的形式输出。
7、设计程序要有模块化的思想,用子程序实现不同的功能;8、所有数据输出前要用字符串的输出指令,进行输出提示(如:zui dazhi shi : 300等),所有数据结果能清晰地显示在电脑屏幕上。
程序流程图如下:程序清单:DATAS SEGMENTSHURU DB 'QING SHU RU 5 GE SHU JU',13,10,'$'SHU1 DB 4,?,3 DUP(?)SHU2 DB 4,?,3 DUP(?)SHU3 DB 4,?,3 DUP(?)SHU4 DB 4,?,3 DUP(?)SHU5 DB 4,?,3 DUP(?)AVER DB 3 DUP(?)SHUCHU DB 'PAI XU HOU DE SHU JU SHUN XU SHI',':','$'MAX DB 'ZUI DA ZHI SHI',':','$'MIN DB 'ZUI XIAO ZHI SHI',':','$'AVERAGE DB 'PING JUN ZHI SHI',':','$'CHUSHU DB 100,10HE DW ?STR1 DB 16 DUP(30H)STR2 DB 'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU',':','$' DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATASMOV DS,AXMOV ES,AXLEA DX,SHURU;显示QING SHU RU 5 GE SHU JU:MOV AH,9INT 21HMOV CX,5;输入五个数字MOV SI,0INPUT: LEA DX,[SHU1+SI];输入要排序的原始数据MOV AH,10INT 21HMOV DL,10;输入后换行MOV AH,2INT 21HADD SI,5;指针加5,指向下一个变量LOOP INPUTCLDMOV CX,4;设定排序外循环次数L1: MOV BP,0PUSH CX;外循环次数入栈PX: PUSH CXMOV CX,3LEA SI,[SHU1+BP+2];逐位比较两个数大小LEA DI,[SHU1+BP+7]REPZ CMPSBJB L2;如果小于直接比较下一个数,否则两个数对换位置MOV CX,3Jh: MOV AL,SHU1[BP+2]XCHG AL,SHU1[BP+7];将两个字节对换位置,循环3次即完成这两个数的交换XCHG AL,SHU1[BP+2]INC BPLOOP JhSUB BP,3L2: ADD BP,5;指向后面两个数字POP CXLOOP PXPOP CX;外循环次数出栈LOOP L1LEA DX,SHUCHU;输出字符串'PAI XU HOU DE SHU JU SHUN XU SHI:' MOV AH,9INT 21HMOV CX,5MOV SI,2OUTPUT:PUSH CX;计数器入栈实现循环嵌套MOV CX,3L3: MOV AL,[SHU1+SI];输出排序后的5个数字MOV DL,ALMOV AH,2INT 21HINC SILOOP L3MOV DL,2CHMOV AH,2INT 21HADD SI,2POP CX;计数器出栈LOOP OUTPUTMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MAX;输出字符串'ZUI DA ZHI SHI:'MOV AH,9INT 21HMOV SI,2L4: MOV DL,[SHU5+SI];输出最大值MOV AH,2INT 21HINC SILOOP L4MOV DL,10;换行MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MIN;输出字符串'ZUI XIAO ZHI SHI:'MOV AH,9INT 21HMOV CX,3MOV SI,2L5: MOV DL,[SHU1+SI];输出最小值MOV AH,2INT 21HINC SILOOP L5MOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,AVERAGE;输出字符串'PING JUN ZHI SHI:'MOV AH,9INT 21HMOV CX,3MOV BX,10;除数10MOV SI,2AD: MOV DX,0MOV AH,0PUSH CXMOV CX,3ZH: MOV AL,[SHU2+SI];将十进制数转换为二进制数,为后面求平均值做准备 SUB AL,30HPUSH AXMOV AX,DXMUL BXPOP AXADD DX,AXINC SILOOP ZH;执行3次完成3个十进制数的转换ADD SI,2POP CXADD HE,DX;将DX的数放在HE中LOOP AD;循环后得到三个十进制数转换为二进制数之后的相加和MOV DX,HE;MOV AX,DXXOR DX,DXMOV BX,3DIV BX;除3取平均值,结果将商放在AX中,余数放在DX中MOV BX,AX;给BX赋值平均数,然后将BX中表示的十进制数转换为对应的字符串DIV CHUSHU;除100取最高位ADD AL,30H;转换为ASCII码MOV AVER,ALMOV AL,AHXOR AH,AHDIV [CHUSHU+1];除10取十位ADD AL,30HADD AH,30H;余数就是个位MOV [AVER+1],ALMOV [AVER+2],AHMOV CX,3MOV SI,0L6: MOV DL,[AVER+SI];输出平均值MOV AH,2INT 21HINC SILOOP L6MOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,STR2 ;输出字符串'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU:’ MOV AH,9INT 21HMOV CX,16MOV SI,0L7: RCL BX,1;将平均数转换为二进制串JNC L8ADD [STR1+SI],1;如果不为0就将其加1变成1的ASCII码值L8: MOV DL,[STR1+SI];将二进制串逐个输出MOV AH,2INT 21HINC SILOOP L7MOV AH,4CHINT 21HCODES ENDSEND START运行结果:心得体会:本次实验编程比较复杂,在编这个程序之前自己先将前面三个练习编了一下,然后参考了书上的一个冒泡排序法的程序,之后才开始动手编该程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《微机原理与接口技术实验报告》学院:电气信息学院班级:电力老师:学号:姓名:目录1.实验目的 (1)2.实验内容 (1)3.程序流程图 (2)4.程序清单与注释 (4)5.运行结果 (10)6.实验心得 (11)一、实验目的:经过第一次试验,我们初次了解了DEBUG调试程序强大功能。
1.学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。
2.理解并掌握各种指令的功能,编写完整的汇编源程序。
3.进一步熟悉DEBUG的调试命令。
二、实验内容:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。
对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。
每一遍的排序由若干次邻元素的排序组成。
4遍排序中,邻元素的排序依次为4,3,2,1遍。
完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。
实验要求:1.编制程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;2.对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;3.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;4.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;5.用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);6.用移位指令将平均值以二进制串的形式输出。
7.设计程序要有模块化的思想,用子程序实现不同的功能;8.所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi :300等),所有数据结果能清晰地显示在电脑屏幕上。
三、程序流程图:2.冒泡排序子程序:SORT四、程序清单与注释:NAME BUBBLE_SORTDATA SEGMENTARRAY DW 5 DUP()COUNT DW 5TWO DW 2FLAG1 DW 0FLAG2 DB 0FAULT DW -1CR DB 0DH,0AH,'$'STR1 DB'Please input five numbers seperated with space and finished with Enter:','$'STR2 DB'The original numbers:','$'STR3 DB'The sorted numbers:','$'STR4 DB'The Min:','$'STR5 DB'The Max:','$'STR6 DB'The Average:','$'STR7 DB'The binary system of the average:','$'STR8 DB'Input error!Please input again!','$'DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,ES:DATASTART: PUSH DSAND AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA DX,STR1MOV AH,09HINT 21HCALL CRLFREIN: CALL INPUTCMP AX,FAULTJE REINLEA DX,STR2MOV AH,09HINT 21HCALL OUTPUTCALL SORTLEA DX,STR3MOV AH,09HINT 21HCALL OUTPUTAND SI,0AND BX,0MOV BX,ARRAY[SI] LEA DX,STR4MOV AH,09HINT 21HCALL ONECALL CRLFLEA DX,STR5MOV AH,09HINT 21HMOV BX,ARRAY[SI+8] CALL ONECALL CRLFLEA DX,STR6MOV AH,09HINT 21HAND DX,0MOV AX,ARRAY[SI+2] ADD AX,ARRAY[SI+4] ADC AX,ARRAY[SI+6] MOV CX,COUNTDEC CXDEC CXDIV CXMOV BX,AXCALL ONECALL CRLFLEA DX,STR6MOV AH,09HMOV CX,16LL1: AND DX,0DIV TWOPUSH DXLOOP LL1MOV CX,16LL2: POP DXADD DL,30HMOV AH,2INT 21HLOOP LL2MOV AH,4CHINT 21HMAIN ENDPCRLF PROCLEA DX,CRMOV AH,09HINT 21HRETCRLF ENDPINPUT PROCMOV CX,COUNTAND SI,0NEXT1: CALL DTBDEC CXCMP DL,20HJE STOCMP DL,0DHJE EXIT2CALL CRLF ERROR: LEA DX,STR8 MOV AH,09HINT 21HCALL CRLFMOV AX,FAULTJMP EXIT3STO: MOV ARRAY[SI],BX ADD SI,2JMP NEXT1EXIT2: MOV ARRAY[SI],BX CALL CRLFEXIT3: RETINPUT ENDPDTB PROCAND BX,0AND FLAG1,0 CHAR: MOV AH,01HINT 21HMOV DL,ALCMP AL,2DHJNZ NEXT2MOV FLAG1,1JMP CHARNEXT2: SUB AL,30HJL NEXT3CMP AL,09HJG NEXT3CBWXCHG AX,BXMOV CX,10MUL CXXCHG AX,BXADD BX,AXJMP CHARNEXT3: CMP FLAG1,1JNZ EXIT1NEG BXEXIT1: RETDTB ENDPOUTPUT PROCCALL CRLFMOV DI,COUNTAND SI,0GO1: MOV BX,ARRAY[SI] TEST BX,8000HJZ GO2MOV DL,2DHMOV AH,02HINT 21HNEG BXGO2: CALL ONEMOV DL,2DHMOV AH,02HINT 21HADD SI,2DEC DIJNZ GO1CALL CRLFRETOUTPUT ENDPONE PROCPUSH BXPUSH CXPUSH SIPUSH DIMOV CX,10000 CALL BTDMOV CX,1000 CALL BTDMOV CX,100 CALL BTDMOV CX,10CALL BTDMOV CX,1CALL BTDADD DL,FLAG2 CMP DL,30H JNE QUIT3MOV AH,02H INT 21H QUIT3: POP DIPOP SIPOP CXPOP BXAND FLAG2,0 RETONE ENDPBTD PROCMOV AX,BXAND DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30H CMP FLAG2,0 JNE QUIT1CMP DL,30HJE QUIT2MOV FLAG2,1QUIT1: MOV AH,02HINT 21HQUIT2: RETBTD ENDPSORT PROCCLDMOV CX,COUNTDEC CXLOO1: MOV DI,CXAND SI,0LOO2: MOV AX,ARRAY[SI] CMP AX,ARRAY[SI+2] JL LOO3XCHG AX,ARRAY[SI+2] MOV ARRAY[SI],AX LOO3: ADD SI,2LOOP LOO2MOV CX,DILOOP LOO1RETSORT ENDPCODE ENDSEND START五、运行结果:1.对300、250、280、240、260五个数据进行冒泡排序,运行结果如下:2、对5802、129、30、7、1233五个数据进行冒泡排序,运行结果如下:3.对-1、23、189、-234、6五个数据进行冒泡排序,运行结果如下:4.当输入不合法时,显示如下:六、实验心得:在本次汇编语言程序设计实验中,我们运用了循环结构对冒泡排序进行了汇编设计。
首先,编写了对给定数据进行冒泡排序的算法设计,以便熟悉冒泡排序的逻辑结构,理清设计思路。
本来,一直以为汇编语言和C语言是差不多的,但是经过初次汇编语言编程,才发现,要用汇编语言编出完整算法是一件很不简单的事情,某一个小小的疏漏都会导致一大堆错误出现。
比如;十六进制的输入时要在后面加上H;;甚至是,做除法,必须要将DX清零。
这些小错误,经过多次实践,终于记到了。
这个算法程序比较复杂,为了使程序更加简洁明了,我对其进行了模块化设计,利用“CALL”指令调用子程序,这样明显非常好用。
为了防止输入无用和输出时遗漏零,引用了首位符号标志来进行判定。
在这一阶段,我也遇到了很大的困难,例如在输入完数据回车后,程序显示输入错误,经过仔细排查后才发现,在2号DOS功能调用时,少写了“INT 21H”;还有子程序结束时,没有写上“RET”;命名过程名时与关键字重复等等。
接下来我还对算法程序进行进一步优化。
为了实现数据对齐,我增加了CRLF 子程序,方便实现回车换行功能。
为了在输入不合法时,进行错误提示我定义了出错标志等等。
在整个上机实验过程中,我对各条语句的含义都有了更深刻的理解,编写程序和独立解决问题的能力都有所加强。
与此同时,我还认识到自己有很多的不足,在以后的上机实验中,要多锻炼,对汇编语言编程进一步的掌握和学习。