武汉理工大学微机原理课设.docx
- 文档编号:30052088
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:35
- 大小:361.16KB
武汉理工大学微机原理课设.docx
《武汉理工大学微机原理课设.docx》由会员分享,可在线阅读,更多相关《武汉理工大学微机原理课设.docx(35页珍藏版)》请在冰豆网上搜索。
武汉理工大学微机原理课设
目录
摘要2
1设计任务及要求3
1.1设计任务3
1.2任务分析3
2总体方案论证3
3设计流程图及软件设计说明5
3.1各过程的定义5
3.2详细设计6
3.3流程图6
4程序调试及结果分析10
5程序的改进及调试结果12
5.1使用号码查询名字的改进12
5.2更新信息的改进13
6心得体会15
参考文献16
附录1程序清单17
摘要
汇编语言是面向机器的程序设计语言。
在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址,如此就增强了程序的可读性和编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为符号语言。
汇编语言可以开发出许多应用软件,主要优点是可以直接、有效的控制计算机硬件,因而容易创建代码序列减小、运行快速的可执行程序,在某些应用领域汇编语言的作用是不容质疑不可代替的。
现在,通讯越来越发达,通讯录的存在成为必须。
所以,在本文中利用汇编语言实现了电话本的设计。
关键词:
汇编语言子程序DOS调用
电话本功能程序
1设计内容及要求
1.1设计任务
编写一个具有电话本功能程序,要求能存储50个电话号码,其中包括人名(20个字符)、电话号码(8个字符)该程序可随时接收新的人名和电话号码,具有随时查询号码的功能(输入人名后,在屏幕上显示相应的电话号码)。
运行此系统后显示菜单选择功能。
1.2任务分析
首先用选择结构来实现不同功能的切换,应用DOS功能调用输入数字选择要使用的功能后,对应不同的数字跳转到不同功能的程序部分,然后再次用DOS功能调用输入要处理的姓名、号码,在不同功能的程序部分对输入的信息进行存储、查询和删除。
实现了个人通讯信息的增减改查。
输入的每个人的信息都有自己的输入缓冲区和记录存储区。
程序执行后,首先显示功能选择界面,根据提示,输入完成功能的代号,再次跳转到相应程序段。
2总体方案论证
每个人的信息包括人名和号码,人名占20个字节,外加一个$字符,电话号码占8个字节,外加一个$字符,所以每个人的信息一共占30个字节。
可以开辟一片连续的存储区,包含30*50即1500个字节,
即VARDB1500DUP(0)。
另外再定义四个需要输入信息的变量,依次为:
SEADB21,0,21DUP(0);搜索姓名变量
NAMDB21,0,21DUP(0);添加姓名变量
NUMDB9,0,9DUP(0);添加号码变量
DELDB21,0,21DUP(0);删除姓名变量
运行程序之后,显示主菜单,可以先在数据段中定义需要显示的内容,然后用9号功能调用进行显示。
添加新的人名和号码时,可以通过10号功能调用,由于10号功能调用时,数据区的第一个单元规定了数据区的大小,第二个单元是预留给10号功能调用装载实际输入字符数的,还有一个数据单元需要放回车命令的ASCII码0DH,因此输入姓名时需要定义23个数据单元,输入电话号码时需要定义11个数据单元。
先将人名和号码暂时存放在NAM和NUM中,然后在逐字节地复制到VAR中,在第21个和第30个存储单元中添加一个$字符,完成添加功能。
由于数据区NAM和NUM需要多次使用,为了避免输入内容不能完全覆盖上次的数据,因此在输入完成之后,需要把回车及其以后的内容置零。
然后把NAM和NUM中的内容从第三个字节单元开始逐字节的复制到VAR中去。
在进行查询功能时,先用10号功能调用将需要查询的姓名输入NAM中,把NAM中的字符从第3个开始,与VAR中的每个人的30个存储单元的前20个字符逐个比较,如果完全相同,则将该人的姓名和电话号码输出,如果找到不相同的字符,则与下一个人名继续比较。
直到把50个人的信息全部比较完,如果还没有相同的字符串,则电话本中不存在这个人。
删除时,先输入要删除的人名,同查询相似,按同样的方法在VAR中寻找相应的数据区,若找到了,则从找到时下面一个人的信息开始,统一向上移动30个字节,若没有找到,则说明要删除的人名的信息不存在。
3设计流程图及其说明
3.1详细设计
显示选择菜单:
键盘输入选项代表的数字。
1代表输入;2代表查找;3代表删除;输入其他则退出。
插入:
检测BP是否为1470:
是,电话本已满,拒绝插入,返回主菜单,可以选择其他功能;否,分别通过键盘输入新的内容到变量NAM和NUM,将其复制到VAR存储单元中。
查询:
输入查找内容到缓冲区,将其与记录姓名进行比较,相等输出,返回主程序;否则进行下一目录比较,全部比较完还未找到则显示不存在,并且显示是否继续查找。
删除:
输入查找内容到缓冲区,将其与记录姓名进行比较,相等则将此名字后面内容前移30个字节以覆盖要删除的内容。
否则进行下一目录比较,比较完还未找到则显示是否继续删除。
退出:
返回DOS。
3.2流程图
(1)总体程序流程图
(2)输入部分流程图
(3)查找部分流程图
(4)删除部分流程图
图4删除部分流程图
4程序调试及结果分析
运行程序后,菜单显示结果如下:
出现3个功能选项,输入数字1则进行名字、号码的输入;输入数字2则进行查找;输入3进行删除;其他情况则退出程序。
(1)输入:
键盘输入1后提示输入名字,按提示输入名字和号码后显示是否继续输入,按Y继续输入,按N回到菜单。
验证输入20个字节的名字和8个字节的号码
如图输入名字AAAAABBBBBCCCCCDDDDD和号码12345678后有
(2)查询:
接着上次,输入N后回到菜单界面后,输入2选择查询功能,查询刚刚输入的名字和号码,显示要找的号码,然后提示是否继续查找,按Y继续查找,按N回到菜单
如图,查找后得到相同的姓名AAAAABBBBBCCCCCDDDDD和号码12345678
(3)删除:
接着上次,输入N后,再次回到菜单界面,输入3后,输入要删除的名字,则删除对应的名字和号码,提示是否继续删除,按Y继续删除,按N回到菜单。
如图,输入要删除的名字AAAAABBBBBCCCCCDDDDD后回车,显示成功删除
(4)当输入了50条信息使存储区满后,显示Thephonebookisfull!
5程序的改进
在实现了课设基本要求的基础上,发现程序功能并不十分完善。
所以做了如下改进,使用此程序时加入了输入号码对名字进行查询的功能,和对名字号码分别修改的更新功能。
使程序更具实用性,现对两处改进做具体说明。
主菜单中进行了改进,输入1是还是进行信息的输入;输入2时进行查询;输入3时进行删除;输入4时进行更新。
5.1使用号码查询名字的改进
主菜单中输入2进入查询部分后,再次进行选择,输入1时根据输入的名字查询号码;输入2时根据输入的号码查询名字。
根据号码查询名字的流程图如下:
当输入名字ASD和号码123456后进行输入号码123456后得到名字ASD。
与之前输入的信息相同。
程序运行结果如下:
5.2更新信息的改进
在主菜单输入4后进入更新信息的部分,再次输入1进行名字的更新,输入2进行号码的更新。
更新部分的流程图:
程序运行结果如下:
改变ASD为ASS后经查询123456对应的名字变为ASS,则更新成功。
同样,改变号码123456为123后经查询名字ASS对应的号码为123,则更新成功。
6心得体会
通过本次课程设计我深刻得体会到了设计程序的困难,设计程序是一个全盘思维的过程.在进行源程序的编写前,一定要对程序怎样运行,程序的原理有一个大致的了解,只有这样,在编写时才能做到纵观全局,不会只局限于某一个特定的模块,但是,这正是我们初学者最容易犯的错误.
在这次课程设计中,我也体验到了这种做法的危害性,刚开始急于求成,没有仔细考虑就动手编写程序,结果程序变好以后,几乎是在不停的改正错误,并且由于没有一个总的框架,导致自己对各个模块之间的关系很模糊,而这种错误正是编程者最大的错误.有了第一次的经验,在第二次修改程序时,经过仔细的考虑后,很少出现错误,对程序的调试有很大的帮助.
通过这次课程设计,我也懂得了全局策划的思想,这正是我所缺乏的,对也是最重要的.
参考文献
[1]《汇编语言程序设计》,吴向军等,高等教育出版社,2002
[2]《IBM-PC汇编语言及程序设计》(第2版),沈美明等,清华大学出版社,2001
[3]《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社,2001
[4]《汇编语言程序设计》,钱晓捷等,电子工业出版社,2000
[5]《汇编语言程序设计》,张志明等,重庆大学出版社,1997
附录1程序清单
DATASSEGMENT
OBF1DB'Welcometousethisphonebook!
$'
OBF2DB'Chooseyouroptions(1/2/3):
$'
OBF11DB'1forinputing$'
OBF16DB'2forsearching$'
OBF17DB'3fordeleting$'
OBF18DB'Otherforexiting$'
OBF3DB'Pleaseinputanewname(within20words):
$'
OBF4DB'pleaseinputthenumber(within8numbers):
$'
OBF5DB'Continuetoinput?
(y/n)$'
OBF6DB'Endthephonebook?
(y/n)$'
OBF7DB'Pleaseinputanameyouwanttosearch(within20words):
$'
OBF33DB'Pleaseinputanumberyouwanttosearch(within8words):
$'
OBF8DB'Foundit,itis:
$'
OBF9DB'Notbeenfound,itdoesnotexit!
$'
OBF10DB'Continuetosearch?
(y/n)$'
OBF12DB'Pleaseinputthenameyouwanttodelete(within20words):
$'
OBF13DB'Thenameyouwanttodeletedoesnotexit!
$'
OBF14DB'Successtodelete!
$'
OBF15DB'Continuetodelete?
(y/n)$'
OBF19DB'Thephonebookisfull!
$'
OBF21DB'4forupdating$'
OBF22DB'Updatingnamepress"1",updatingnumberspress"2"$'
OBF23DB'Pleaseinputthenameyouwanttoupdate:
$'
OBF24DB'Pleaseputthenewname(within20words):
$'
OBF25DB'Successtoupdate!
$'
OBF26DB'Pleaseinputthenumbersyouwanttoupdate:
$'
OBF27DB'Pleaseputthenewnumbers(within20words):
$'
OBF28DB'Continuetoupdate?
(y/n)$'
OBF29DB'Thenameyouwanttoupdatedoesnotexist!
$'
OBF30DB'Thenumberyouwanttoupdatedoesnotexist!
$'
OBF31DB'Searchingthenumbersbyinputinganamepress"1",seachingthenamebyinputingnumberspress"2"$'
SEA1DB21,0,21DUP(0);查询姓名变量
SEA2DB9,0,9DUP(0);查询号码变量
NAMDB21,0,21DUP(0);添加姓名变量
NUMDB9,0,9DUP(0);添加号码变量
DELDB21,0,21DUP(0);删除姓名变量
VARDB1500DUP(0)
DATASENDS
STACKSSEGMENT
DW32DUP(0)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBP,-30
BEGIN:
CALLNEXTLINE
MOVDX,OFFSETOBF1;显示菜单选择界面
MOVAH,9
INT21H
CALLNEXTLINE;调用换行函数
MOVDX,OFFSETOBF2
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF11
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF16
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF17
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF21
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF18
MOVAH,9
INT21H
CALLNEXTLINE
MOVAL,0
MOVAH,1
INT21H
CMPAL,'1';选择1,输入信息
JEINPUT
CMPAL,'2';选择2,查询信息
JESEARCH
CMPAL,'3';选择3,删除信息
CMPAL,'4';选择4,更新信息
JEUPDATE
JEDELETE
JMPSTOP
INPUT:
CALLNEXTLINE
ADDBP,30
MOVSI,BP
CMPBP,1470
JNBSTOP
MOVSI,BP
MOVCX,30
S2:
MOVBYTEPTRVAR[SI],0;清除VAR中最后一个人的信息后面的30
INCSI;个字节中非0的单元
LOOPS2
MOVSI,BP
MOVDX,OFFSETOBF3
MOVAH,9
INT21H
MOVDX,OFFSETNAM;输入的人名存放在NAM中
MOVAH,10
INT21H
MOVBX,-1
S5:
INCBX;为避免NAM中刚输入的信息没有完全覆
CMPBYTEPTRNAM[BX+2],0DH;盖上一次的信息,将出车符(0DH)及其后
JNES5;面的字节归0
S6:
MOVBYTEPTRNAM[BX+2],0
INCBX
CMPBX,21
JNES6
MOVBYTEPTRNAM[BX+2],0DH
MOVCX,20
MOVBX,-1
S1:
INCBX;将NAM复制到VAR中
MOVDL,BYTEPTRNAM[BX+2]
MOVBYTEPTRVAR[SI+BX],DL
LOOPS1
MOVBYTEPTRVAR[SI+20],'$'
CALLNEXTLINE
MOVDX,OFFSETOBF4;输入的号码放在NUM中
MOVAH,9
INT21H
MOVDX,OFFSETNUM
MOVAH,10
INT21H
MOVBX,-1
S7:
INCBX;为避免刚输入的号码没有完全覆盖上一次的号码,将输
CMPBYTEPTRNUM[BX+2],0DH;入的号码的最后一位的回车符(0DH)换成$
JNES7
MOVBYTEPTRNUM[BX+2],'$'
ADDSI,21
MOVCX,8
MOVBX,-1
S3:
INCBX
MOVDL,BYTEPTRNUM[BX+2];将NUM复制到VAR中
MOVBYTEPTRVAR[SI+BX],DL
LOOPS3
MOVBYTEPTRVAR[SI+8],'$'
CALLNEXTLINE
MOVDX,OFFSETOBF5
MOVAH,9
INT21H
CALLNEXTLINE
MOVAH,1;判断是否再次输入信息
INT21H
CMPAL,'Y'
JEINPUT
CMPAL,'y'
JEINPUT
JMPBEGIN
STOP:
CMPBP,1470
JBSTOP1
CALLNEXTLINE
MOVDX,OFFSETOBF19
MOVAH,9
INT21H
STOP1:
CALLNEXTLINE
MOVDX,OFFSETOBF6
MOVAH,9
INT21H
MOVAL,0
MOVAH,1
INT21H
CMPAL,'Y'
JEEXIT
CMPAL,'y'
JNEBEGIN
EXIT:
MOVAX,4C00H;退出电话本程序
INT21H
UPDATE:
CALLNEXTLINE
MOVDX,OFFSETOBF22
MOVAH,9
INT21H
CALLNEXTLINE
MOVAH,1
INT21H
CMPAL,'1'
JEUNAME
CMPAL,'2'
JEUNUMBERS
UNAME:
CALLNEXTLINE;删除功能模块
MOVDX,OFFSETOBF23;输入你要的名字,存放在SEA1中
MOVAH,9
INT21H
MOVDX,OFFSETSEA1
MOVAH,10
INT21H
MOVBX,-1
U1:
INCBX;为避免SEA1刚输入的信息没有完全覆盖上一次的信息,
CMPBYTEPTRSEA1[BX+2],0DH;将回车符(0DH)及其后面的字节归0
JNEU1
U2:
MOVBYTEPTRSEA1[BX+2],0
INCBX
CMPBX,21
JNEU2
MOVBYTEPTRSEA1[BX+1],'$'
CALLNEXTLINE
MOVCX,50;在VAR中搜索与SEA1相等的字符串
MOVSI,-30
U3:
ADDSI,30
MOVBX,-1
U4:
INCBX
CMPBX,20
JEU5
PUSHAX
MOVAL,BYTEPTRVAR[SI+BX]
MOVAH,BYTEPTRSEA1[BX+2]
CMPAL,AH
POPAX
JEU4
LOOPU3
MOVDX,OFFSETOBF29
MOVAH,9
INT21H
JMPU9;要更新的人名不存在
U5:
CALLNEXTLINE
MOVDX,OFFSETOBF24
MOVAH,9;输入新名字
INT21H
MOVDX,OFFSETSEA1
MOVAH,10
INT21H
MOVBX,-1
U6:
INCBX
CMPBYTEPTRSEA1[BX+2],0DH
JNEU6
U7:
MOVBYTEPTRSEA1[BX+2],0
INCBX
CMPBX,21
JNEU7
MOVBYTEPTRSEA1[BX+1],'$'
MOVCX,20
MOVBX,0
U8:
MOVAL,BYTEPTRSEA1[BX+2]
MOVBYTEPTRVAR[SI],AL
INCSI
INCBX
LOOPU8
MOVBYTEPTRVAR[SI],'$'
CALLNEXTLINE
U9:
MOVDX,OFFSETOBF25
MOVAH,9
INT21H
CALLNEXTLINE
MOVDX,OFFSETOBF28
MOVAH,9
INT21H
MOVAH,1
INT21H
CMPAL,'y'
JEUPDATE
CMPAL,'Y'
JEUPDATE
JMPBEGIN
UNUMBERS:
CALLNEXTLINE
MOVDX,OFFSETOBF26
MOVAH,9
INT21H
MOVDX,OFFSETSEA2
MOVAH,10
INT21H
MOVBX,-1
N6:
INCBX;为避免SEA2刚输入的信息没有完全覆盖上一次的信息,
CMPBYTEPTRSEA2[BX+2],0DH;将回车符(0DH)及其后面的字节归0
JNEN6
N7:
MOVBYTEPTRSEA2[BX+2],0
INCBX
CMPBX,21
JNEN7
MOVBYTEPTRSEA2[BX+1],'$'
CALLNEXTLINE
MOVCX,50;在VAR中搜索与SEA2相等的字符串
MOVSI,-30
ADDSI,21
N1:
ADDSI,30
MOVBX,-1
N2:
INCBX
CMPBX,8
JEN3
PUSHAX
MOVAL,BYTEPTRVAR[SI+BX]
MOVAH,BYTEPTRSEA2[BX+2]
CMPAL,AH
POPAX
JEN2
LOOPN1
MOVDX,OFFSETOBF30
MOVAH,9
INT21H
JMPN8;要更新的号码不存在
N3:
MOVDX,OFFSETOBF27;输入新号码
MOVAH,9
INT21H
MOVDX,OFFSETSEA2
MOVAH,10
INT21H
MOVBX,-1
N9:
INCBX
CMPBYTEPTRSEA2[BX+2],0DH
JNEN9
N4:
MOVBYTEPTRSEA2[BX+2],0
INCBX
CMPBX,21
JNEN4
MOVBYTEPTRSEA2[BX+1],'$'
MOVCX,8
MOVBX,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉理工大学 微机 原理