《微机原理与接口技术实验——冒泡法(8页).doc》由会员分享,可在线阅读,更多相关《微机原理与接口技术实验——冒泡法(8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-一、 实验内容用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX)排序遍数本遍排序前第一次排序后第二次排序后第三次排序后第
2、四次排序后1300,250,280,240,260250,300,280,240,260250,280,300,240,260250,280,240,300,260250,280,240,260,3002250,280,240,260,300250,280,240,260,300250,240,280,260,300250,240,260,280,3003250,240,260,280,300250,240,260,280,300240,250,260,280,3004240,250,260,280,300240,250,260,280,300实验要求:1.编制程序,对这组数进行排序,并输出原
3、数据及排序后数据;2.利用DEBUG调试工具,用D0(是D零命令)命令,查看排序前后,内存数据的变化;3. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;4. 用学过的压栈PUSH和出栈POP指令,将平均值按位逐个输出(即输出263);5将平均值263转化为二进制串,并将这组二进制串输出。6.所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。二、 程序清单及流程图冒泡法:DATA SEGMENT ;定义数据段 VAR DW 300,250,280,240,260 ;定义待排序的量 N
4、 EQU $-VAR ;占内存空间的大小,是次数的两倍 ;因为这是字定义 EJ DW ? ;给平均值预留存储空间 YSSJ DB yuan shi shu ju ji lu shi:$ ;原始数据的输出提示 PXH DB 0DH,0AH,pai xu hou de shu ju ji lu shi:$;排序后的输出 ; 提示 MAXS DB 0DH,0AH,zui da zhi shi:$;最大值输出提示 MINS DB 0DH,0AH,zui xiao zhi shi:$;最小值输出提示 EQS DB 0DH,0AH,ping jun zhi shi:$;平均值10进制输出提示 EQE DB
5、 0DH,0AH,ping jun shu de er jin zhi dai ma shi:$;平均值 ;的二进制数制的输出提示DATA ENDS ;定义堆栈段STACK SEGMENT PARA STACK STACK STAPN DW 200 DUP (?)STACK ENDS ;定义代码段CODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ;定义各代码段,数据段,堆栈段 ;初始化START: MOV AX,DATA MOV DS,AX MOV CX,N-2 ;原始数据显示 MOV DX,OFFSET YSSJ ;显示原始数据的输出提示的字符串,下同
6、MOV AH,9 ;系统调用09H号功能,输出字符串 INT 21H MOV CX,N ;输出原始数据循环初值 MOV DX,10 ;DX的初始化 MOV SI,0 ;变量的偏移量0,2,4,6,8XSX: MOV AX,VARSI ;将变量依次取出,逐个显示 CALL XSXH ;调用显示子程序 ADD SI,2 ;改变变量的偏移量 DEC CX ;改变CX,结束循环 LOOP XSX ;冒泡算法 MOV CX,N-2WXH: PUSH CX MOV SI,0NXH: MOV AX,VARSI ;暂存当前内存中的数据,一个字变量 CMP AX,VARSI+2 ;与下一内存中的字变量比较 JL
7、E NXF ;如果前一字变量不大于后一字变量,不做交换, ;直接修改偏移地址 XCHG AX,VARSI+2 ;该项SI值并不改变 XCHG AX,VARSI ;交换,将较大值往后移NXF: ADD SI,2 ;改变偏移量,将所有数比较完 DEC CX ;实现内层循环 LOOP NXH POP CX ;改变外层循环次数 DEC CX ;外层循环次数递减 LOOP WXH ;排序后的数据显示(同原始数据显示) MOV DX,OFFSET PXH ;显示排序后数据的输出提示的字符串 MOV AH,9 ;字符串显示 INT 21H MOV CX,N MOV DX,0 MOV SI,0XSH: MOV
8、 AX,VARSI CALL XSXH ;调用显示子程序 ADD SI,2 DEC CX LOOP XSH ;最小值输出显示 MOV DX,OFFSET MINS MOV AH,9 INT 21H MOV SI,0 MOV AX,VARSI ;最小值是排序后该片内存中偏移量为0的数值 CALL XSXH ;最大值输出显示,最大值的偏移量与定义的类型及个数有关 MOV DX,OFFSET MAXS MOV AH,9 INT 21H MOV AX,VARSI+8 ;最大值是该片内存中偏移量最大为N-2的值 CALL XSXH ;求平均值 MOV DX,0 MOV CX,2 ;保存求和的个数,此处去
9、掉最大最小值,个数为 ;N/2-2 MOV SI,2 ;暂存求和起始偏移量,此处为2,不排最小值 MOV AX,VARSIQH: ADD SI,2 ADD AX,VARSI LOOP QH ;此循环用来求取排完序后的和 MOV BX,3 CWD ;扩展,求平均值,此处平均值大于255 IDIV BX ;余数在DX,商在AX MOV EJ,AX ;将平均值(即商)写入内存,备用 ;使用PUSH,POP功能实现显示10进制的平均值 MOV DX,OFFSET EQS MOV AH,9 INT 21H ;输出相应提示字符串 MOV AX,EJ ;将平均值写入寄存器,进行处理 MOV BL,10 ;先
10、取最低位 IDIV BL MOV DL,AH ;余数在高位,给DX暂存 PUSH DX ;最低位先压栈 AND AX,00FFH ;将余数清0,保留商,再次取余 IDIV BL ;此前为变BL值,再次取余,的次低位 MOV DL,AH ;将余数给DL暂存 PUSH DX ;次低位压栈 MOV DL,AL ;此例仅3为,若有更高位,继续上述处理 PUSH DX ;最高位压栈 MOV CX,3 ;CX存十进制数的位数 XHSC: POP DX ADD DL,30H MOV AH,02H INT 21H LOOP XHSC ;依次弹出最高位,次高位,最低位,并逐一显示 ;将平均值转换为二进制显出 M
11、OV DX,OFFSET EQE MOV AH,9 INT 21H ;输出相应提示字符串 MOV BX,EJ ;将平均值写入BX寄存器进行处理 MOV CX,16 ;循环次数,与定义的类型相关,一个字节8次XHYW: ROL BX,1 ;循环左移,依次取最低位 MOV DL,BL ;数据暂存 AND DL,01H ;取最低位,其余清0 ADD DL,30H MOV AH,02H INT 21H LOOP XHYW ;依次显示各位 ;算法结束,回归系统 MOV AH,4CH INT 21H; 显示子程序 仅用于显示,此处不使用堆栈,XSXH PROC MOV BL,100 ;这里取最高位,数值1
12、00与位数有关,若有4位,则为1000 IDIV BL ;除法,得余数和商 MOV DX,AX ;高余低商,故将商给DX,取最高位,商只有一位 PUSH DX ;保护DX ADD DL,30H MOV AH,02H INT 21H ;显示最高位 POP DX MOV AL,DH AND AX,00FFH ;将余数位清0,以免影响结果 MOV BL,10 IDIV BL MOV DX,AX PUSH DX ADD DL,30H MOV AH,02H INT 21H ;显示次高位 POP DX MOV DL,DH ADD DL,30H MOV AH,02H INT 21H ;显示最低位,若有更高位
13、与上述方法一致 MOV DL,2CH ;AH此处未变 INT 21H RETXSXH ENDPCODEENDS ;代码段结束ENDSTART ;源程序结束流程图:开始显示yuanshishujujilushi的字符串设置循环初值 依次取出变量显示改变变量偏移量,改变CX调用子程序显示暂存当前字变量与下一变量比较确定是否交换循环进行变量比较字符串paixuhoudeshujujilushi输出最大最小值取出显示去掉最大最小值求平均值并输出CX=0?NYU 子程序取最高位进行除法显示最高位余数置零显示次高位显示最低位结束调用子程序将平均值通过左移转换为二进制数输出结束三、 运行结果yuan shi
14、 shu ju ji lu shi : 300,250,280,240,260,pai xu hou de shu ju ji lu shi: 240,250,260,280,300,zui xiao zhi shi: 240,zui da zhi shi: 300ping jun zhi shi: 263ping jun shu de er jin zhi dai ma shi: 0000000100000111编译:链接:运行结果:四、 调试分析和体会用DO命令查看排序前后,内存数据的变化在此次编写程序的过程中,遇到问题主要是因为对冒泡法的不熟悉,在编写程序的过程中进度较慢,参照着书上的冒
15、泡法,但是在之后遇到的问题便是在编译出错很多时,需要慢慢地借助DEBUG工具以及自己的检查来找出错误,这个过程比较艰难。错误主要出现在:由于此次的程序较长,在进行跳转的时候弄错跳转的地方,而每次检查又比较的久,主要借助单步调试来进行检查。此外在调用程序的过程中,对CALL指令的不熟悉,导致错用误用。还有就是程序的逻辑性思维还是有些混乱,导致程序调试编写的过程比较艰难。但最后还是在不断地DEBUG下,把冒泡的程序理解深入并编写调试成功。自身体会:逻辑思维的训练不是一朝一夕的事情,每次都会因为逻辑思维的不清晰,而导致编写程序时有些混乱。在冒泡法的程序中表现得尤为明显。并且对于一些调用的指令还是不太熟悉,需要理论和实际一块加强。另外在编写程序中,以后要养成在写完每一句在后边加注释的习惯,这样子,便会加强程序的可读性,不管是自己还是别人。程序在编写运行的过程中,单步调试来进行检查是个很好的工具,就像老师所说的,如果让老师给检查错位,老师也一眼看不出来,也需要进行DEBUG来进行找错,而我们有这个工具,就要学会自己利用工具来找错误,既会让自己深刻理解程序,也可以锻炼自己的独立学习的能力。-第 8 页-