有序表查询.docx
《有序表查询.docx》由会员分享,可在线阅读,更多相关《有序表查询.docx(16页珍藏版)》请在冰豆网上搜索。
![有序表查询.docx](https://file1.bdocx.com/fileroot1/2022-11/22/db598abd-e844-4b95-9c8c-642f616721a9/db598abd-e844-4b95-9c8c-642f616721a91.gif)
有序表查询
华北科技学院
课程设计说明书
专业:
网络工程
课程名称:
汇编语言班级:
网络B093班
姓名:
沈亚强学号:
200907024313
设计题目:
有序表插入、删除、查询程序
设计时间:
2011.12.5至2011.12.16
评语:
评阅成绩:
评阅教师:
李冬艳
一、课程设计目的
进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法,要求程序必须正确。
3.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
4.要求程序结构合理,语句使用得当。
5.适当追求编程技巧和程序运行效率。
三、课程设计题目
有序表的插入、删除,查询程序。
四、问题陈述及需求分析
问题陈述
有序表插入、查询、删除程序是对从键盘输入的数字进行转换、排序、显示、数字的插入、查询以及删除有序表中的数字等功能,其中包括以下几个模块:
(1)从键盘输入数字个数(两位数),根据提示依次输入若干个数字形成一列数;
(2)根据所输入的数字大小用冒泡法进行降序排序。
(3)从键盘输入所要查找的数字,若找到则输出该数字找到信息及其在有序表中的位置,否则输出查找不到的提示信息。
(4)向有序表中插入数字,并重新排序得出新的排序结果和有序表中数字个数。
(5)删除有序表中的数字,同时显示删除数字所在有序表中的位置及删除后的排序结果。
(6)退出程序,若想退出程序则按“Y”,若想继续则按“N”。
功能需求分析
有序表插入、删除、查询程序提供以下功能:
1、DOS界面下以菜单方式工作
2、输入所要插入到有序表中的数字个数,并依次输入若干个数字形成一列数
3、根据所输入的数字大小进行排序并显示排序结果
4、查找有序表中某个数字及其在有序表中的位置
5、向有序表中插入新的数字,并重新排序
6、删除有序表中的数字,同时显示该数字的位置和删除后的排序结果
7、是否要退出操作界面
五、总体设计
功能结构图设计
依据程序的功能需求,描述该程序功能的结构图如下:
有序表插入、删除、查询
1
输入有序表中数字个数
2显示排序结果
3
输入要查找数字
7退出操作界面
6
删除有序表中数字
5
向有序表中插入数字
4查找数字结果及其位置
模块简介
依据程序的功能模块的划分,各模块定义如下:
(1)从键盘输入数字个数并依次输入一列数字
模块名:
Inputthenumber(输入数字)
模块描述:
通过此模块可以在BUF存储单元中输入一列两位数的数字。
在此过程中要完成数字的ASCII码转换及输入数字显示。
(2)根据输入数字的大小按降序排序使BUF中数字有序排列。
模块名:
Arrangeanddisplaythenumber(排序并显示排序结果)
模块描述:
根据输入数字的大小利用冒泡法将一列数字有序排列。
在此过程中数字要进行比较、交换直到循环结束,然后显示排序结果。
(3)从键盘输入要查找数字
模块名:
Pleaseinputthenumberyouwanttofind(输入要查找的数字)
模块描述:
输入要查找的两位数数字然后显示出来。
(4)查找从键盘输入的数字在有序表中的位置
模块名:
TOsearchthenumberanddisplaythesequence(查找数字并显示其位置)
模块描述:
根据输入数字与有序表中的数字逐一相比较,如果在有序表中查找到与输入数字相等的数字则显示查找到,并显示所要查找数字在有序表中的位置。
此过程涉及到数字循环比较、计数过程,若找到则显示所要查找数字在有序表中的位置,否则给出相关提示。
(5)从键盘输入要插入到有序表的数字
模块名:
Toinsertthenumberanddisplaythesequence(插入数字并显示新排序)
模块描述:
从键盘输入的数字与有序表中的数字相比较,之后得出新的排序结果。
若输入的数大于有序表中的原始最大值则直接插入,若小于则逐一比较,移位,然后插入到有序表中。
(6)从键盘输入要删除的数字
模块名:
Todeletethenumber(删除数字)
模块描述:
从键盘输入要删除的数字,然后与有序表中的数字相比较,若在有序表中找到与之相等的数字,则从有序表中删除该数字并显示输入数字在有序表中的位置,同时显示删除后的排序结果。
此过程涉及到数字比较、删除、数字移位、所删除数字的位置显示以及数列长度减1。
(7)退出操作界面
模块名:
EXIT!
(退出)
模块描述:
操作完毕后,若想退出操作界面则按“Y”,若想继续操作则按“N”。
六、详细设计
算法说明
1、主过程的算法设计:
清屏、显示菜单及运用选择操作,调用各个子程序过程,最后退出程序。
主要代码:
MAINPROCNEAR;主程序开始
START:
MOVAX,DATAS;加载数据段
MOVDS,AX
MOVES,AX
ZHS:
CLEAR_SCREEN;调用清屏宏
XSSTR0;调用显示宏(菜单显示开始)
HUICHE;调用回车换行宏
XSSTR11
HUICHE
XSSTR1
HUICHE
XSSTR2
HUICHE
XSSTR3
HUICHE
XSSTR4
HUICHE
XSSTR5
HUICHE
XSSTR6
HUICHE
XSSTR7
HUICHE
XSSTR13
HUICHE
XSSTR11;(菜单显示结束)
MOVAH,7;键入一个字符不回显
INT21H
SUBAL,30H
CALLCHECK;调用差错检验子程序
BIJ1H,SHUZI;调用比较宏
BIJ2H,PAIXU
BIJ3H,SHURU
BIJ4H,CHAZHAO
BIJ5H,CHARU
BIJ6H,SHANCHU
BIJ7H,TUICHU
SHUZI:
CLEAR_SCREEN;清屏
CALLINPUT;调用输入数字子程序
JMPZHS;无条件转回到ZHS处
PAIXU:
CLEAR_SCREEN;清屏
CALLARRANGE;调用排序显示子程序
JMPZHS;无条件转回到ZHS处
SHURU:
CLEAR_SCREEN;清屏
PUSHDX;DX入栈保护
XSSTR17
HUICHE;调用回车换行宏
CALLZIFUSHURU;调用从键盘输入字符子程序
HUICHE
MOVSI,0
MOVNUM[SI],BX;保存被操作的数字
XSSTR18
MOVAH,1
INT21H
CMPAL,20H;显示空格
JEZHS
XSSTR12
HUICHE
POPDX;恢复DX
JMPZHS;无条件转回到ZHS处
CHAZHAO:
CLEAR_SCREEN
CALLSEARCH;调用查找子程序
JMPZHS
CHARU:
CLEAR_SCREEN
CALLINSERT;调用插入子程序
JMPZHS
SHANCHU:
CLEAR_SCREEN
CALLDELETE;调用删除子程序
JMPZHS
TUICHU:
CLEAR_SCREEN;清屏
XSSTR21
HUICHE
XSSTR22
HUICHE
MOVAH,1;从键盘输入字符
INT21H
CMPAL,'Y';若为Y,退出
JEDONE
CMPAL,'N';若为N返回菜单
JEZHS
DONE:
MOVAH,4CH;结束程序
INT21H
MAINENDP;主程序结束
整体程序流程图:
主程序开始
初始化
清屏宏调用
菜单显示
CALLCHECK
BIJ宏调用
1234567
SHUZ
I
PA
I
XU
SHURU
TU
I
CHU
SHANCHU
CHARU
CHAZHAO
CALL
INPUT
CALL
ARRANGE
CALL
Z
I
FUSHURU
CALL
SEARCH
CALL
I
NSERT
CALL
DELETE
输入Y退出
—
输入N继续
结束
2、子过程的算法设计
(1)INPUT(输入数字)子程序
子程序INPUT
该过程的程序流程图如图所示:
CX<—存储单元数目
向BUF送零
DI循环加2
循环结束?
N
CALLZIFUSHURU
Y
CX<—实际数字个数
CX入栈保护
键盘输入两位数字
是否在0~9之间
N
AX值扩大10倍—>BX
Y
AX与BX相加—>BX
BUF[SI]<—BX
SI循环加2
CX出栈
RET返回
循环结束?
YN
(2)ARRANGE子程序即数字排序子程序
子程序ARRANGE
该过程的程序流程图如图所示:
CX<—数字个数K
保护外循环次数
AX<—BUF[SI]
BUF[SI]>=BUF[SI+2]?
Y
AX与BUF[SI+2]互换值
N
BUF[SI]<—AX互换后的值
SI循环加2
内循环结束?
N
恢复外循环次数
Y
外循环结束?
N
CALLSHUZIXS
Y
RET返回
(3)SEARCH子程序即查找子程序
子程序SEARCH
该过程的程序流程图如图所示:
CX<—数字个数K
INCCX
AX<—要查找的数字
AX与BUF[SI]逐一比较
是否相等
Y
SI循环加2
N
AX<—P值
P自加1
循环结束?
CALLDISPLAY
N
RET返回
Y
关键代码:
MOVAX,NUM[DI];要查找的数字送到AX中
SE1:
CMPAX,BUF[SI];AX与有序表中的值逐一比较
JESEA;如果相等转到SEA处
ADDSI,2;如果不等,SI加2
INCP;同时P自加1
LOOPSE1;循环继续查找
XSSTR9
JMPRT1
SEA:
XSSTR8MOVAX,P;显示计数(即位置)过程
HUICHE
XSSTR20CALLDISPLAY;调用显示数字子程序
(4)INSERT子程序即数字插入子程序
子程序INSERT
该过程的程序流程图如图所示:
AX<—要插入的数字
BUF[DI]大于AX值吗?
Y
N
直接插入到表最后
BUF中的数字后移,再进行比较
DI减2
同时表长度K加1
循环结束?
CALLSHUZIXS
N
Y
RET返回
关键代码:
MOVAX,NUM[SI];要插入的数字送给AX
CMP1:
CMPBUF[DI],AX;BUF中最后一个数字与AX比较
JAEINSQ;如果大于等于则转到INSQ处
MOVBX,BUF[DI];如果小于,则移位
MOVBUF[DI+2],BX
SUBDI,2;同时DI减2
JMPCMP1;无条件转到CMP1处继续比较
INSQ:
MOVBUF[DI+2],AX;AX值放到BUF最后面
ADDK,1;同时表长度加1
最后就是显示相关信息、排序结果以及新排序表的长度即在原来长度上加1。
(5)DELETE子程序即数字删除子程序
该过程的程序流程图如图所示:
子程序DELETE
查找要删除的数字
AX入栈保存
CALLDISPLAY
AX出栈
AX与K是否相等?
Y
CX<—数字个数K
表长度K减1
N
CALLSHUZIXS
SUBCX,Q
DI<—AX
比较DI与1是否相等?
DI加2
DI加2
BUF中的数字移位
BUF中的数字移位
NN
循环是否结束?
循环是否结束?
YY
RET返回
七、编码和测试
(1)菜单选项界面整体结构图:
(2)输入数字个数及一列数字结果图:
(3)输入数字的降序排序结果图:
(4)输入查找数字的查找结果及其在有序表中的位置结果图:
(5)输入所要插入的数字并显示新的排序结果及新的数列长度结果图:
(6)删除有序表中的数字,并显示其在有序表中的位置及新排序结果图
(7)退出操作界面结果图
以上是有序表的数字个数输入、一列数字输入、数字排序结果显示、数字查找结果及其在有序表中位置显示、数字插入、插入后新排序及新的表长度显示、操作界面退出显示结果图。
八、总结与体会
此次课程设计的内容有关有序表的插入、删除、查询程序设计,在程序设计和功能实现过程中用到汇编语言中模块程序设计思想,使整个程序划分为多个子程序,各个子程序分别实现不同功能,然后再通过主程序的调用,使整个复杂的大程序变为清晰有条理,方便程序读写、调试和修改。
经过模块划分后的程序设计涉及到汇编语言内容主要有BIOS中断相关知识的运用、子程序的编写和调用、宏的使用、冒泡排序程序设计思想、从键盘输入数字ASCII码转换和显示、分支程序设计伪指令应用(无条件转移JMP、条件转移)、循环程序设计伪指令应用、寻址方式的运用以及基本汇编伪指令的使用等知识。
其中程序设计当中大量运用到宏定义(回车换行宏定义、显示宏定义、比较宏定义、清屏宏定义等)和子程序调用(CHECKPROCNEAR检查、ZIFUSHURUPROCNEAR字符ASCII码转换、SHUZIXSPROCNEAR字符显示、INPUTPROCNEAR数字输入、ARRANGEPROCNEAR数字排序、数字插入、删除、查询等子程序的设计)。
这两方面知识的运用大大简化程序代码,使程序变得简练、清晰、有条理,程序逻辑性更加强;由于子程序设计存在一定的缺陷:
每次执行完CALL指令后就要对端点和现场进行保护,传参时要占用寄存器或存储器,编程过程中容易出错。
因此,在实现有序表的插入、删除、查询功能时,结合宏定义使用,这样能使程序不断优化,使程序达到更好的效果;宏指令运用不亚元来传参比较方便且不易出错,不过多次使用宏定义会使程序代码不断加长,因此,在使用过程中适当使用。
另外,在其他子程序设计过程中要考虑到一些容易出错的知识点。
汇编语言是一门与硬件直接相关的语言,因此很多操作功能的使用需要反复调用,为此,程序显得十分烦琐,通过子程序的调用,可将这些重复的步骤,加以简化,为内存节省空间。
通过有序表插入、删除、查询的编程和在编程过程中遇到的问题的思考,提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足,尤其是在运用BIOS中断知识设计清屏代码段时,要调用INT10H的各个功能号设置窗口属性、字体颜色等知识。
通过这次课程设计,我巩固所了之前学过的基础知识,能用汇编语言熟练地运用宏定义、子程序设计、循环伪指令、分支程序设计伪指令以及基本汇编指令,进一步掌握了各个指令的功能,特别是转向指令。
在整个程序的编写中,调试占了很大部分的时间。
要想写好汇编语言的程序,必须认真对待代码的每一个细节以及注意寄存器的保护,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。
通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平。
不过设计过程中暴露出了自己的一些问题,动手和实践能力不足,知识上还有许多漏洞,缺乏大型程序的开发经验,例如:
在编写删除数字子程序代码时,只知道根据输入的数字在有序表中查找与之相等的数字代码编写,而如何从有序表中删除这个数,当时编写代码时有一定的困难,之后通过同学讨论,网上查找相关知识,再经过多次调试,问题才得以解决。
。
希望以后在编程的学习上和操作、调试过程中掌握更多有关编程经验和知识,逐渐弥补这些不足。