汇编BinarySearch二分查找.docx
《汇编BinarySearch二分查找.docx》由会员分享,可在线阅读,更多相关《汇编BinarySearch二分查找.docx(11页珍藏版)》请在冰点文库上搜索。
汇编BinarySearch二分查找
一、实验目的
1.熟悉汇编语言程序设计的开发环境、格式以及汇编过程;
2.熟练掌握Debug命令的U命令、D命令、R命令、G命令、T命令、Q命令等;
3.掌握分支程序的设计方法。
二、实验原理及基本技术路线图(方框原理图)
1.Debug常用命令简介:
D命令:
格式:
D[range]或D[address],显示部分存储区的内容;
U命令:
格式:
U[address],将内存某一区的机器码,用此命令反汇编为源程序;
R命令:
格式:
R[Registername],显示和修改各寄存器的内容;
G命令:
格式:
G[=address][address[address..],执行需运行的程序,并对调试的程序进行断点测试跟踪;
T命令:
格式:
T[=address][Value],执行以CS:
IP中指定开始的一个或几个指令,并显示出执行每条指令后所有寄存器的内容;
Q命令:
格式:
Q,退出DEBUG状态,说明:
Q命令不保留正在内存中运行的文件,若保留需用"W"命令,DEBUG返回到命令处理程序,然后显示出正常的命令提示。
2.折半查找流程图
具有分支结构的程序叫做分支程序。
设计分支程序时最好先用流程图画出程序流向,这样思路清晰,也利于编码实现,实现分支时要用到转移指令。
以下为折半查找的流程图:
开始
输入要查找的数CHAR
CHAR=BUF[MID]
MIN≤MAX
Y
N
结束
Y
N
N
MID=(MAX+MIN)/2
初始化MAX、MIN
CHAR<BUF[MID]
Y
MAX=MID-1
查找次数加1
MIN=MID+1
查找次数加1
输出未找到
输出BUF[MID],并输出查找次数
三、所用仪器、材料(设备名称、型号、规格等)
1.操作系统平台:
WindowsServer2003
2.汇编环境:
MicrosoftMASM5.0
3.文本编辑器:
记事本
四、实验方法、步骤
1.将MASM5.0的文件置于C:
\assembly\目录下;
2.将masm.exe和link.exe所在目录(C:
\assembly\MASM5)添加到Path环境变量中;
3.用记事本在C:
\assembly\下新建一个BS.asm文件,打开BS.asm,输入汇编程序代码;
4.运行一个命令行窗口,将当前目录切换到C:
\assembly\,然后输入命令:
masmBS.asm[Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止,此时会生成BS.obj文件;
5.输入命令:
linkBS.obj[Enter],观察输出结果,如果没有错误,则生成BS.exe文件;
6.输入命令:
debugBS.exe[Enter],调试程序,并记录运行过程;
7.完成实验报告。
五、实验过程原始记录(数据、图表、计算等)
1.将C:
\assembly\MASM5目录添加到Path环境变量中:
2.新建BS.asm文件,输入汇编程序代码:
程序源码:
STACKSGSEGMENTSTACK'S'
DW64DUP('ST')
STACKSGENDS
DATASEGMENT
BUFDB30H,31H,32H,33H,34H,35H,36H
DB37H,38H,39H,41H,42H,43H,44H,45H;有序表
COUNTEQU$-BUF;表项数
CHARDB?
;要查找的数
MARKDW0;查找次数
PROMPTDB'NOFOUND$';没找到提示信息
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKSG
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVAH,1;输入要查找数的字符
INT21H
MOVCHAR,AL;保存要找的数
LEASI,BUF;表起始地址,初始化区间下限(左)
MOVCX,COUNT
MOVDX,SI
ADDDX,CX;最后数的地址加1
MOVDI,DX;初始化区间上限(右)
MOVDX,0
CMPAL,[SI];判边界元素
MOVBX,SI
JBNOFID;小于表中最小数转未找到
JEFOUND;是表中最小数转找到
CMPAL,[DI-1];判边界元素
MOVBX,DI
JANOFID;大于表中最大数转未找到
JEFOUND;是表中最大数转找到
MOVDX,1;初始化查找次数
MOVAL,CHAR;要查找的数
C1:
MOVBX,SI;循环入口
ADDBX,DI
SHRBX,1;折半
CMPAL,[BX];比较
JZFOUND;找到转
PUSHF
CMPBX,SI;指针=下限吗?
JZNOFID;若等于表示未找到,转
POPF
JLLESS;可能在左半区转
MOVSI,BX;可能在右半区,调整下限
JMPSHORTNEXT
LESS:
MOVDI,BX;调整上限
NEXT:
INCDX;查找次数加1
JMPC1
NOFID:
LEADX,PROMPT;显示未找到提示信息
MOVAH,9
INT21H
JMPSHORTEXIT
FOUND:
MOVMARK,DX;保存查找次数
PUSHDX
MOVAH,2;显示找到的数
MOVDL,[BX]
INT21H
MOVCL,10
POPAX
DIVCL;把查找次数转换成十进制数
ORAX,3030H;转换成ASCII码
MOVDL,AL
PUSHAX
MOVAH,2;显示查找次数的高位
INT21H
POPAX
MOVDL,AH
MOVAH,2;显示查找次数的低位
INT21H
EXIT:
MOVAX,4C00H
INT21H
MAINENDP
CODEENDS
ENDMAIN
3.汇编源程序:
4.连接生成可执行文件:
5.调试程序:
(1)程序前奏部分(执行了第一句MOVAX,0BCB,当前(AX)=0BCB)
(2)输入要查找的数3,当前AL的值为33H(3的ASCII码)
(3)判断3是否小于或等于最小值,显然不成立,继续判断3是否大于或等于最大值
(4)以上判断均不成立,则置查找次数为1,进入二分查找程序段
(5)第一次比较判断可能在左半区,调整上限,查找次数加1
(6)转入第二次比较
(7)第二次比较后找到了
(8)进入FOUND程序段
(9)找到之后,显示找到的数3
(10)分别显示查找次数的高位0和低位2
(11)程序退出
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸)
1.从本次实验我体会到:
分支程序在设计之前流程图可以明确我们的编程思路,代码书写会比较流畅。
另外代码书写时要严格注意格式,否则代码较长时,会造成思路混乱,好好代码书写习惯是写好程序的前提。
2.DEBUG命令在汇编程序之后对程序的调试中非常有用,适当使用不同的命令,可以加快我们的调试速度,提高编程效率。
最常用的U命令、G命令、T命令和Q命令必须熟练掌握。
在调试中,适时的使U命令反汇编程序,可以查看当执行到哪一段代码了;G命令可以让我们执行自定义的代码段;G命令和T命令结合使用可以查看当寄存器值的变化和程序逻辑的正确性;当发现程序有逻辑错误时,可以使用Q命令退出程序修改代码,再进行调试。
其他的命令如:
R命令、D命令等也可以使我们的调试更加高效快速。
3.编写程序时,要密切关注寄存器的状态以及各条语句对标志位的影响(如果程序中用到的话)。
另外在编写指令时要尽量选择最优的,刚开始可能写的不是很好,但经常练习就会体会到同种功能的不同语句的区别。