微机原理实验报告-冒泡排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
(1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。
(2)理解并掌握各种指令的功能,编写完整的汇编源程序。
(3)进一步熟悉DEBUG 的调试命令,运用DEBUG 进行调试汇编语言程序。
二、实验内容及要求
(1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。
(2)实验要求:
①编制程序,对这组数进行排序并输出原数据及排序后的数据;
②利用DEBUG 调试工具,用D0命令,查看排序前后内存数据的变化;
③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值;
④用压栈PUSH 和出栈POP 指令,将平均值按位逐个输出;
⑤将平均值转化为二进制串,并将这组二进制串输出;
⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。
三、程序流程图
(1)主程序:MAIN
否
是
开始 初始化 键盘输入数据 调用INPUT 子程序 输入是否正确 显示原始数据 调用OUTPUT 子程序 显示输入错误
显示冒泡排序后的数据
调用SORT子程序
调用OUTPUT子程序
显示最小值Min
显示One子程序
显示最大值Max
调用One子程序
显示其余数平均值Average 调用One子程序
显示平均值二进制串Binary 调用One子程序
结束
(2)冒泡排序子程序: SORT
否
是
否
是
否
是
进入 初始化 COUNT1=N-1 COUNT2=COUNT1 SI=0
COUNT1 ---- 外循环次数 COUNT2 ---- 内循环次数 i ---- 数组下标 Ai≥A i+1 Ai 与A i+1两数交换 SI=SI+2
COUNT2=COUNT2-1
COUNT2=0? COUNT1=COUNT1-1 COUNT2=0? 返回
四、程序清单
NAME BUBBLE_SORT
DATA SEGMENT
ARRAY DW 5 DUP(?) ;输入数据的存储单元
COUNT DW 5
TWO DW 2
FLAG1 DW 0 ;判断符号标志
FLAG2 DB 0 ;判断首位是否为零的标志
FAULT DW -1 ;判断出错标志
CR 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 ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA
START: PUSH DS
AND AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA DX,STR1
MOV AH,09H ;9号DOS功能调用,提示输入数据
INT 21H
CALL CRLF ;回车换行
REIN: CALL INPUT ;调用INPUT子程序,输入原始数据CMP AX,FAULT ;判断是否出错,
JE REIN ;出错则重新输入
LEA DX,STR2
MOV AH,09H ;9号DOS功能调用,提示输出原始数据
INT 21H
CALL OUTPUT ;调用OUTPUT子程序,输出原始数据
CALL SORT ;调用SORT子程序,进行冒泡排序
LEA DX,STR3
MOV AH,09H ;9号DOS功能调用,提示输出排序后的数据
INT 21H
CALL OUTPUT ;调用OUTPUT子程序,输出排序后的数据
AND SI,0
AND BX,0
MOV BX,ARRAY[SI] ;将最小值存入BX
LEA DX,STR4
MOV AH,09H ;9号DOS功能调用,提示输出数据的最小值
INT 21H
CALL ONE ;调用ONE子程序,输出最小值
CALL CRLF
LEA DX,STR5
MOV AH,09H ;9号DOS功能调用,提示输出排序后的最大值
INT 21H
MOV BX,ARRAY[SI+8] ;将最大值存入BX
CALL ONE ;调用ONE子程序,输出最大值
CALL CRLF
LEA DX,STR6
MOV AH,09H ;9号DOS功能调用,提示输出平均值
INT 21H
AND DX,0
MOV AX,ARRAY[SI+2] ;将去掉最大最小值的其余各数之和存入AX
ADD AX,ARRAY[SI+4]
ADC AX,ARRAY[SI+6]
MOV CX,COUNT ;计数器CX=5
DEC CX ;CX←CX-1
DEC CX
DIV CX ;字除法,余数存入AX
MOV BX,AX ;将余下各数的平均值存入BX
CALL ONE ;调用ONE子程序,输出去掉最大最小值的其余数平均值
CALL CRLF
LEA DX,STR6
MOV AH,09H ;9号DOS功能调用,提示输出平均值的二进制串
MOV CX,16 ;16位二进制串,计数器初始值为16
LL1: AND DX,0
DIV TWO
PUSH DX
LOOP LL1
MOV CX,16
LL2: POP DX
ADD DL,30H ;将DL中的数进行ASCII码转换
MOV AH,2 ;2号DOS功能调用,输出字符“0”或“1”
INT 21H
LOOP LL2
MOV AH,4CH
INT 21H ;4C号功能调用,返回DOS
MAIN ENDP