微机原理实验报告-冒泡排序

合集下载

冒泡排序(实验报告)

冒泡排序(实验报告)

一、实验目的和要求理解和掌握冒泡排序技术,使用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页

微机原理实验报告冒泡法对数据排序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语言中的数组和循环结构等基本语言要素,完成了对数组中的数据进行排序
的操作。

通过本次实验,我们深入了解了算法的实际应用,掌握了编程语言的基本技巧,
对于今后的学习和实践具有重要的意义。

冒泡排序计算实验报告

冒泡排序计算实验报告

一、实验目的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篇)

实验报告_冒泡排序法(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. 通过实验,分析冒泡排序算法的时间复杂度和空间复杂度。

4. 了解冒泡排序在实际应用中的优缺点。

二、实验内容1. 实验环境:Windows操作系统,C++编程语言。

2. 实验步骤:(1)创建一个冒泡排序函数,用于对整数数组进行升序排序。

(2)编写主函数,接收用户输入的整数个数和整数数据,调用冒泡排序函数进行排序。

(3)输出排序后的数组。

(4)分析冒泡排序算法的时间复杂度和空间复杂度。

三、实验代码```cpp#include <iostream>using namespace std;// 冒泡排序函数void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}// 主函数int main() {int n;cout << "请输入整数个数: ";cin >> n;int arr[n];// 读取用户输入的整数cout << "请输入 " << n << " 个整数: "; for (int i = 0; i < n; i++) {cin >> arr[i];}// 调用冒泡排序函数bubbleSort(arr, n);// 输出排序后的数组cout << "排序后的结果: ";for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;}```四、实验结果与分析1. 运行程序,输入10个整数:34, 12, 56, 78, 9, 25, 47, 89, 36, 15。

微机原理及接口技术实验——冒泡法

微机原理及接口技术实验——冒泡法

微机原理及接口技术实验——冒泡法冒泡排序是一种简单的排序算法,其基本思想是通过重复比较相邻的两个元素,并将较大的元素交换到右侧,从而将最大的元素逐渐"冒泡"到最右侧。

这种算法得名于每次比较时较大元素"冒泡"到右侧的过程。

冒泡排序算法的步骤如下: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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WORD格式一、实验目的(1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。

(2)理解并掌握各种指令的功能,编写完整的汇编源程序。

(3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。

二、实验内容及要求(1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。

(2)实验要求:①编制程序,对这组数进行排序并输出原数据及排序后的数据;②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化;③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值;④用压栈PUSH和出栈POP指令,将平均值按位逐个输出;⑤将平均值转化为二进制串,并将这组二进制串输出;⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。

三、程序流程图开始(1)主程序:MAIN初始化键盘输入数据调用INPUT子程序显示输入错误否输入是否正确是显示原始数据调用OUTPUT子程序WORD格式显示冒泡排序后的数据调用SORT子程序调用OUTPUT子程序显示最小值Min显示One子程序显示最大值Max调用One子程序显示其余数平均值Average调用One子程序显示平均值二进制串Binary调用One子程序结束(2)冒泡排序子程序:SORTCOUNT1----外循环次数进入COUNT2----内循环次数i----数组下标初始化COUNT1=N-1COUNT2=COUNT1SI=0否Ai≥i A+1是Ai与A i+1两数交换SI=SI+2COUNT2=COUNT2-1否COUNT2=0?是COUNT1=COUNT1-1否COUNT2=0?是返回四、程序清单NAMEBUBBLE_SORTDATASEGMENTARRAYDW5DUP(?);输入数据的存储单元COUNTDW5TWODW2FLAG1DW0;判断符号标志FLAG2DB0;判断首位是否为零的标志FAULTDW-1;判断出错标志CRDB0DH,0AH,'$'STR1DB'PleaseinputfivenumbersseperatedwithspaceandfinishedwithEnter:','$' STR2DB'Theoriginalnumbers:','$'STR3DB'Thesortednumbers:','$'STR4DB'TheMin:','$'STR5DB'TheMax:','$'STR6DB'TheAverage:','$'STR7DB'Thebinarysystemoftheaverage:','$'STR8DB'Inputerror!Pleaseinputagain!''$'DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,ES:DATASTART:PUSHDSANDAX,0PUSHAXMOVAX,DATAMOVDS,AXLEADX,STR1MOVAH,09H;9号DOS功能调用,提示输入数据INT21HCALLCRLF;回车换行REIN:CALLINPUT;调用INPUT子程序,输入原始数据CMPAX,FAULT;判断是否出错,JEREIN;出错则重新输入LEADX,STR2MOVAH,09H;9号DOS功能调用,提示输出原始数据INT21HCALLOUTPUT;调用OUTPUT子程序,输出原始数据CALLSORT;调用SORT子程序,进行冒泡排序LEADX,STR3MOVAH,09H;9号DOS功能调用,提示输出排序后的数据INT21HCALLOUTPUT;调用OUTPUT子程序,输出排序后的数据ANDSI,0ANDBX,0MOVBX,ARRAY[SI];将最小值存入BXLEADX,STR4MOVAH,09H;9号DOS功能调用,提示输出数据的最小值INT21HCALLONE;调用ONE子程序,输出最小值CALLCRLFLEADX,STR5MOVAH,09H;9号DOS功能调用,提示输出排序后的最大值INT21HMOVBX,ARRAY[SI+8]将;最大值存入BXCALLONE;调用ONE子程序,输出最大值CALLCRLFLEADX,STR6MOVAH,09H;9号DOS功能调用,提示输出平均值INT21HANDDX,0MOVAX,ARRAY[SI+2];将去掉最大最小值的其余各数之和存入AXADDAX,ARRAY[SI+4]ADCAX,ARRAY[SI+6]MOVCX,COUNT;计数器CX=5DECCX;CX←CX-1DECCXDIVCX;字除法,余数存入AXMOVBX,AX;将余下各数的平均值存入BXCALLONE;调用ONE子程序,输出去掉最大最小值的其余数平均值CALLCRLFLEADX,STR6MOVAH,09H;9号DOS功能调用,提示输出平均值的二进制串MOVCX,16;16位二进制串,计数器初始值为16LL1:ANDDX,0DIVTWOPUSHDXLOOPLL1MOVCX,16LL2:POPDXADDDL,30H;将DL中的数进行ASCII码转换MOVAH,2;2号DOS功能调用,输出字符“0”或“1”INT21HLOOPLL2MOVAH,4CHINT21H;4C号功能调用,返回DOSMAINENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:CRLF功能:回车和换行;--------------------------------------------------------------------------------------------------------------------------------CRLFPROCLEADX,CRMOVAH,09HINT21HRETCRLFENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:INPUT功能:输入一组数据;--------------------------------------------------------------------------------------------------------------------------------INPUTPROCMOVCX,COUNT;计数器CX=5ANDSI,0NEXT1:CALLDTB;调用DTB子程序,将输入转换为二进制数DECCX;CX←CX-1CMPDL,20H;判断输入字符是否为空格符JESTOCMPDL,0DH;判断输入字符是否为换行符JEEXIT2CALLCRLFERROR:LEADX,STR8MOVAH,09H;9号DOS功能调用,提示输入不合法INT21HCALLCRLFMOVAX,FAULT;以AX中的值作为出错标志JMPEXIT3STO:MOVARRAY[SI],BX;是空格符,将BX中的二进制数存入存储单元ADDSI,2JMPNEXT1EXIT2:MOVARRAY[SI],BX;是换行符,将BX中的二进制数存入存储单元CALLCRLFEXIT3:RETINPUTENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:DTB功能:将键盘输入的十进制数转换为二进制数形式存入BX;--------------------------------------------------------------------------------------------------------------------------------DTBPROCANDBX,0ANDFLAG1,0;符号标志,0为正,1为负CHAR:MOVAH,01H;1号DOS功能调用,输入一个字符,存入ALINT21HMOVDL,ALCMPAL,2DH;判断输入字符是否为负号"-"JNZNEXT2MOVFLAG1,1;是负数,将符号标志FLAG1置1JMPCHARNEXT2:SUBAL,30H;判断输入字符是否在0-9之间JLNEXT3CMPAL,09HJGNEXT3CBWXCHGAX,BX;输入字符在0-9之间,将BX中的数乘以10MOVCX,10MULCXXCHGAX,BXADDBX,AX;将BX中的数与新输入的数相加JMPCHARNEXT3:CMPFLAG1,1;根据符号标志判断输入是否为负JNZEXIT1NEGBX;对BX中的数求补EXIT1:RETDTBENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:OUTPUT功能:输出一组数据;--------------------------------------------------------------------------------------------------------------------------------OUTPUTPROCCALLCRLFMOVDI,COUNT;计数器DI=5ANDSI,0GO1:MOVBX,ARRAY[SI];将存储单元的第一组数据存入BXTESTBX,8000H;判断正负JZGO2MOVDL,2DHMOVAH,02H;2号DOS功能调用,输出负号"-"INT21HNEGBXGO2:CALLONE;调用ONE子程序,将BX中二进制数转换为十进制数输出MOVDL,20HMOVAH,02H;2号DOS功能调用,输出空格符INT21HADDSI,2;指针指向下一数据DECDI;DI←DI-1JNZGO1;计数器DI不为零,继续循环CALLCRLFRETOUTPUTENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:ONE功能:将BX中的的二进制数转换为十进制数,由高到低各位依次输出;--------------------------------------------------------------------------------------------------------------------------------ONEPROCPUSHBXPUSHCXPUSHSIPUSHDIMOVCX,10000;除数存入CXCALLBTDMOVCX,1000CALLBTDMOVCX,100CALLBTDMOVCX,10CALLBTDMOVCX,1CALLBTDADDDL,FLAG2CMPDL,30H;与"0"的ASCII码比较,判断该数是否为"0"JNEQUIT3MOVAH,02H;2号DOS功能调用,输出"0"INT21HQUIT3:POPDIPOPSIPOPCXPOPBXANDFLAG2,0;将首位标志FLAG2重新置0RETONEENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:BTD功能:将BX中的二进制数转换为一个十进制数输出;--------------------------------------------------------------------------------------------------------------------------------BTDPROCMOVAX,BXANDDX,0DIVCX;字除法,商值存入AX,余数存入DXMOVBX,DX;余数存入BXMOVDL,ALADDDL,30H;对DL中的数进行ASCII码转换CMPFLAG2,0;判断是否为首位数据JNEQUIT1CMPDL,30H;是首位则判断是否为"0"JEQUIT2;是"0"则不输出MOVFLAG2,1;不是"0"将首位标志置1QUIT1:MOVAH,02H;2号DOS功能调用,输出一位十进制数INT21HQUIT2:RETBTDENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:SORT功能:冒泡排序;--------------------------------------------------------------------------------------------------------------------------------SORTPROCCLDMOVCX,COUNT;初始化计数器CXDECCX;CX=4LOO1:MOVDI,CX;CX中的数存入DIANDSI,0LOO2:MOVAX,ARRAY[SI]CMPAX,ARRAY[SI+2];相邻两数进行比较JLLOO3XCHGAX,ARRAY[SI+2];前一数较大则进行数据交换MOVARRAY[SI],AXLOO3:ADDSI,2;前一数较小,则进行下一组比较LOOPLOO2;CX=0,停止内循环MOVCX,DI;还原计数器CX的值LOOPLOO1;CX=0,停止外循环RETSORTENDP;--------------------------------------------------------------------------------------------------------------------------------CODEENDSENDSTART五、运行结果(1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下:(2)对-1,2,54,-38,43五个数进行冒泡排序,运行结果如下(1)当输入不合法时,出现错误提示:(4)当输入数据不足5个时程序自动补0:六、心得体会在本次汇编语言程序设计实验中,我们学习了汇编语言的循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计,这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。

相关文档
最新文档