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

更新时间:2023-05-04 21:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

'、实验内容

用“冒泡“法对一组数300, 250, 280, 240, 260,按从小到大的顺序排列

提示:

用冒泡的方法对一组数据元素排序,它的基本方法是:

将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排 序。

对于5 ( N )个元素,整个排序通过4遍(=N-1 )邻元素排序完成。每一遍的排序由若干次 邻元素的排序组成。

4遍排序中,邻元素的排序依次为 4, 3, 2, 1遍。完成第一遍排序后,最大数沉底,已经 到达它应占据的位置,不需要参加下一遍的排序。

外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DECCX )

排序遍数本遍排序前第一次排序第二次排序第三次排序第四次 后后后后 240, 260240, 260240, 260300, 260260J 300

欠排序

1300, 250, 280, 250, 300, 280, 250, 280, 300, 250,280, 240, 250, 280

240, 2250, 280, 3250, 240, 260, 300260, 260, 250, 280、240, 250, 240, 300260, 30C280, 300

280, 250, 240, 260,

4240, 250, 280, 300280, 260, 250, 240, 260, 240, 250, 300280, 300

260,

240, 250, 260,

280, 300280, 300

实验要求:

1. 编制程序,对这组数进行排序,并输出原数据及排序后数据;

2. 利用DEBU调试工具,用D0(是D零命令)命令,查看排序前后,内存数据的变化;

3. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;

4. 用学过的压栈PUSH和出栈POF指令,将平均值按位逐个输出(即输出263);

5将平均值263转化为二进制串,并将这组二进制串输出。

6.所有数据输出前要用字符串的输出指令,进行输出提示(如:zuidazhishi:300 等),所有数据结果能清晰地显示在屏幕上。

二、程序清单及流程图

冒泡法:

DATASEGMEI定义数据段

VARDW300,250,280,240,260;定义待排序的量

NEQU$-VA占内存空间的大小,是次数的两倍;因为这是字定义

EJDW?给平均值预留存储空间

YSSJDB'yua nshishujujilushi:$:原始数据的输出提示PXHDBODH,OAH,'paixuhoudeshujujilushi:$:排序后的输出

;提示

MAXSDBODH,OAH,'zuidazhishi:$:最大值输出提示MINSDBODH,OAH,'zuixiaozhishi:$:最小值输出提示

EQSDB0DH,0AH,'pingjunzhishi:$';平均值10 进制输出提示

EQEDB0DH,0AH,'pi ngjun shudeerji nzhidaimashi:$:平均值

;的二进制数制的输出提示

DATAENDS

;定义堆栈段

STACKSEGMENTPARASTACK'STACK'

STAPNDW200DUP⑺

STACKENDS

;定义代码段

CODESEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACK各代码段,数据段,堆栈段;

初始化

START:MOVAX,DATA

MOVDS,AX

MOVCX,N-2

;原始数据显示

MOVDX,OFFSETYS显示‘原始数据的输出提示’的字符串,下同

MOVAH,9系统调用09H号功能,输出字符串

INT21H

MOVCXN俞出原始数据循环初值

MOVDX,10;D的初始化

MOVSI,0;变量的偏移量024,6,8

XSX:MOVAX,VAR[SI]将变量依次取出,逐个显示CALLXSXH调用显示子程序

ADDSI,2;改变变量的偏移量

DECCX改变CX结束循环

LOOPXSX

;冒泡算法

MOVCX,N-2

WXH:PUSHCX

MOVSI,0

NXH:MOVAX,VAR[SI暂存当前内存中的数据,一个字变量

CMPAX,VAR[SI+2]与下一内存中的字变量比较

JLENXF如果前一字变量不大于后一字变量,不做交换,;直接修改偏移地址

XCHGAX,VAR[SI+2]该项SI值并不改变

XCHGAX,VAR[SI]交换,将较大值往后移

NXF:ADDSI,2;改变偏移量,将所有数比较完

DECCX实现内层循环

LOOPNXH

POPCX改变外层循环次数

DECCX外层循环次数递减

LOOPWXH

;排序后的数据显示(同原始数据显示)

MOVDXQFFSETPXH示'排序后数据的输出提示’的字符串

MOVAH,9字符串显示

INT21H

MOVCX,N

MOVDX,0

MOVSI,0

XSH:MOVAX,VAR[SI]

CALLXSXH调用显示子程序

ADDSI,2

DECCX

LOOPXSH

;最小值输出显示

MOVDX,OFFSETMINS

MOVAH,9

INT21H

MOVSI,0

MOVAX,VAR[SI]最小值是排序后该片内存中偏移量为0的数值

CALLXSXH

;最大值输出显示,最大值的偏移量与定义的类型及个数有关MOVDXQFFSETMAXS

MOVAH,9

INT21H

MOVAX,VAR[SI+8]最大值是该片内存中偏移量最大为N-2的值CALLXSXH

;求平均值

MOVDX,0

MOVCX,2保存求和的个数,此处去掉最大最小值,个数为

;N/2-2

MOVSI,2;暂存求和起始偏移量,此处为2,不排最小值

MOVAX,VAR[SI]

QH:ADDSI,2

ADDAX,VAR[SI]

LOOPQH匕循环用来求取排完序后的和

MOVBX,3

CWD T展,求平均值,此处平均值大于255

IDIVBX;余数在DX 商在AX

MOVEJ,AX将平均值(即商)写入内存,备用

;使用PUSH POP功能实现显示10进制的平均值MOVDXQFFSETEQS

MOVAH,9

INT21H;输出相应提示字符串

MOVAX,[EJ];将平均值写入寄存器,进行处理

MOVBL,10先取最低位

IDIVBL

MOVDL,AH余数在高位,给DX暂存

PUSHDXI低位先压栈

ANDAX,00FFH备余数清0,保留商,再次取余

IDIVBL;此前为变BL值,再次取余,的次低位

MOVDL,AH将余数给DL暂存

PUSHDXI低位压栈

MOVDL,AL此例仅3为,若有更高位,继续上述处理

PUSHDXI高位压栈

MOVCX,3;C存十进制数的位数

XHSC:POPDX

ADDDL,30H

MOVAH,02H

INT21H

LOOPXHS依次弹出最高位,次高位,最低位,并逐一显示;将平均值转换为二进制显出

MOVDXQFFSETEQE

MOVAH,9

INT21H;输出相应提示字符串

MOVBX,[EJ];将平均值写入BX寄存器进行处理

MOVCX,16循环次数,与定义的类型相关,一个字节8次

XHYW:ROLBX,循环左移,依次取最低位

MOVDL,BL数据暂存

ANDDL,01H取最低位,其余清0

ADDDL,30H

MOVAH,02H

INT21H

LOOPXHY依次显示各位

;算法结束,回归系统

MOVAH,4CH

INT21H

;显示子程序仅用于显示,此处不使用堆栈,

XSXHPROC

MOVBL,1O0这里取最高位,数值100与位数有关,若有4位,则为1000

IDIVBL;除法,得余数和商

MOVDX,A)高余低商,故将商给DX取最高位,商只有一位

PUSHDX^护DX

ADDDL,30H

MOVAH,02H

INT21H;显示最高位

POPDX

MOVALQH

ANDAX,00FFH将余数位清0,以免影响结果

MOVBL,10

IDIVBL

MOVDX,AX

PUSHDX

ADDDL,30H

MOVAH,02H

INT21H;显示次高位

POPDX

MOVDL,DH

ADDDL,30H

MOVAH,02H

INT21H;显示最低位,若有更高位与上述方法一致MOVDL,2CH;A此处未变

INT21H

RET

XSXHENDP

CODEEND代码段结束

ENDSTAR源程序结束

流程图:

改变变量偏移量,改变CX

卜一变量比较确定是否交换

字符串 -pa^uhop^eshujujilushi ------ 输出

调用了程序显示

最大最小值取出显示

开始

显示 yuanshishujujilushi

的字符

设置循环初值

了程序

取最高位

依次取出变量显示

进行除法

显示最咼位

调用子程序

CX=O

? Y

余数置零

暂存当前字变量

显示次咼位

显示最低位

去掉最大最小值求平均值并输出

纟结束

三、运行结果

yua nshishujujilushi:300,250,280,240,260,

paixuhoudeshujujilushi:240,250,260,280,300, zuixiaozhishi:240,

zuidazhishi:300

pingjun zhishi:263

pingjun shudeerji

nzhidaimashi:OOOOOOO1OOOOO111

编译:

链接:

rrhc COMPAQ Fcrsondi 1 Conput eir Lin he r Un T9- ion 2 4H C CCo pi ght CoropAf] C ORI [MI t e r ion 19B2 # 1 CO t Gopii i i*iiglut M icrosoft Corp? 19B1 > 1

ObjC' C C Ho d u l^s l| H QBiJ )

Hun Fi 1c IMP! EXE I : List File

INIIL.MAPI :

运行结果:

08060601 meeBi

p^l xu nou ae sitti ju j 1 Eui x 1^0 zhl

shi?2^0, EU I da zhi shl = 3HM, ping

jun zhi shi z2^3

Jun sHu de

eminated noir VIA

■ 2 [

四、调试分析和体会

用DO命令查看排序前后,内存数据的变化

在此次编写程序的过程中,遇到问题主要是因为对冒泡法的不熟悉,在编写程序的过程中进度较慢,参照看书上的冒泡法,但是在之后遇到的问题便是在编译出错很多时,需要慢慢地借助DEBUG:具以及自己的检查来找出错误,这个过程比较艰难。

错误主要出现在:

由于此次的程序较长,在进行跳转的时候弄错跳转的地方,而每次检查又比较的久,主要借助单步调试来进行检查。此外在调用程序的过程中,对CALL指令的不熟悉,导致错用误用。还有就是程序的逻辑性思维还是有些混乱,导致程序调试编写的过程比较艰难。但最后还是在不断地DEBUGS把冒泡的程序理解深入并编写调试成功。

自身体会:

逻辑思维的训练不是一朝一夕的事情,每次都会因为逻辑思维的不清晰,而导致编写程序时有些混乱。在冒泡法的程序中表现得尤为明显。并且对于一些调用的指令还是不太熟悉,需要理论和实际一块加强。另外在编写程序中,以后要养成在写完每一句在后边加注释的习惯,这样子,便会加强程序的可读性,不管是自己还是别人。程序在编写运行的过程中,单步调试来进行检查是个很好的工具,就像老师所说的,如果让老师给检查错位,老师也一眼看不出来,也需要进行DEBU来进行找错,而我们有这个工具,就要学会自己利用工具来找错误,既会让自己深刻理解程序,也可以锻炼自己的独立学习的能力。

本文来源:https://www.bwwdw.com/article/ig4e.html

Top