课程设计综合实验报告书科院模版.docx
《课程设计综合实验报告书科院模版.docx》由会员分享,可在线阅读,更多相关《课程设计综合实验报告书科院模版.docx(21页珍藏版)》请在冰点文库上搜索。
课程设计综合实验报告书科院模版
科技学院
课程设计(综合实验)报告
(2010--2011年度第1学期)
名称:
汇编语言程序设计课程设计
题目:
查找匹配字符串
院系:
信息工程系
班级:
学号:
学生姓名:
指导教师:
设计周数:
一周
成绩:
日期:
2010年12月10日
一、课程设计的目的与要求
实验一比较字符串sample
熟悉DEBUG有关命令的使用方法;利用DEBUG掌握有关指令的功能;利用DEBUG运行简单的程序段。
进入和退出DEBUG程序;学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。
对于U命令、N命令、W命令等,也应试一下;利用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。
编写一个程序:
比较两个字符串string1和string2所含的字符数是否相同。
若相同则显示‘math’,否则,显示‘nomath’;要求编写程序,并汇编,连接,运行,然后使用Debug调试该程序。
实验二查找匹配字符串
程序接受用户键入的一个关键字以及一个句子。
如果句子中不含关键字则显示‘nomath’;如果句子中包含关键字则显示‘math’,且把该字在句子中的位置用十六进制数显示出来。
实验三分类统计字符的个数
程序接收用户键入的一行字符(用回车符结束),并按字母,数字及其他字符分类计数,然后将结果存入以letter,digit和other为名的存储单元中。
实验四查找电话号码
4.1要求程序建立一个可存50项的电话号码表,每项包括人名及电话号码两部分;
4.2程序可接受输入人名及相应的电话号码,并把他们加入到电话号码表中;
4.3凡有新的输入后,程序应按人名对电话号码表重新排序;
4.4程序可接受需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上显示出来。
实验五屏幕窗口程序
在屏幕上开出三个窗口,它们的行列坐标如下图所示。
光标首先定位在右窗口最下面一行的行首(15,50),如果从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。
若需要将字符显示于左窗口,则先按下左键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示左窗口的内容。
当一行字符显示满后,窗口自动向上卷动一行,输入字符继续显示于最低一行,窗口最高一行向上卷动后消失。
实验六扩充键盘处理功能
在完成键盘处理基本功能的基础上,增加left_shift和right_shift键的功能。
要求实现左右SHIFT任何一个键处于按下状态时输入字符为键盘的上档字符或大写字母,否则输出数字或小写字母。
二、设计(实验)正文
实验一比较字符串sample
(1)设计思路
将两个字符串通过lea指令放入si和di中,用指令repz取字符串的首地址开始比较,REPZ表示在CX不为0时,且ZF=1重复执行后面的串处理指令CMPS。
如果不同选择NOTMATCH输出,否则输出MATCH。
REPZCMPSB
JZMATCH
JMPNOTMATCH
(2)程序框图
(3)程序实现LEASI,STRING1
LEADI,STRING2/*分别放入字符串于SI和DI*/
CLD/*规定字符串于SI和DI的比较方向*/
MOVCX,25/*设置字符串比较次数*/
REPZCMPSB/*循环比较字符串*/
JZMATCH/*字符串相同跳转*/
LEADX,MESS2
JMPSHORTDISP/*字符串不相同无条件跳转*/
MATCH:
LEADX,MESS1
DISP:
MOVAH,09/*输出结果*/
INT21H
MOVAH,4CH
INT21H
(4)实验结果(实验的运行结果)
实验二查找匹配字符串
(1)设计思路(包括程序的原理,算法及数据结构等)
(2)程序框图(画出程序主要部分流程图)
(3)程序实现
leadx,mess1
movah,09
int21h;输出Enterkeyword
leadx,stoknin1
movah,0ah;用21号中段的0ah号功能获取关键字
int21h
cmpact1,0
jeexit;如果为空直接退出程序
a10:
输入Sentence并判断
leadx,change
movah,09
int21h;输出回程,换行
leadx,mess2
movah,09
int21h;输出EnterSentence:
leadx,stoknin2
movah,0ah
int21h;用21号中段的0ah号功能获取句子
moval,act1
cbw
movcx,ax;保存关键字长度到cx
pushcx;cx入栈
moval,act2
cmpal,0
jea50;保存句子长度到al,若句子为空则跳转显示notmatch
subal,act1
jsa50;若句子长度小于关键字长度,则跳转显示notmatch
incal
cbw
leabx,stokn2;将句子的首地址放进BX
movdi,0
movsi,0
a20:
;比较,内循环
movah,[bx+di]
cmpah,stokn1[si]
jnea30
incdi
incsi
deccx
cmpcx,0
jea40
jmpa20
a30:
;外循环,BX+1,清空si,di继续内循环比较
incbx
decal
cmpal,0
jea50
movdi,0
movsi,0
popcx
pushcx
jmpa20
a40:
;match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出
subbx,offsetstokn2
incbx
leadx,change
movah,09
int21h
leadx,mess3
movah,09
int21h
callbtoh
leadx,mess5
movah,09
int21h
jmpa10
btohprocnear;二进制转换十六进制
movch,4
rotate:
movcl,4
rolbx,cl
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlprintit
addal,7h
printit:
movdl,al
movah,2
int21h
decch
jnzrotate
ret
btohendp
(4)实验结果(实验的运行结果)
实验三分类统计字符的个数
(1)设计思路(包括程序的原理,算法及数据结构等)
(2)程序框图(画出程序主要部分流程图)
(3)程序实现(注意:
不用写出整体程序,写出部分关键代码即可,不要粘贴大量代码,代码后要求用文字描述代码完成的功能)
(4)实验结果(实验的运行结果)
实验四查找电话号码
(1)设计思路(包括程序的原理,算法及数据结构等)
(2)程序框图(画出程序主要部分流程图)
(3)程序实现(注意:
不用写出整体程序,写出部分关键代码即可,不要粘贴大量代码,代码后要求用文字描述代码完成的功能)
DATASSEGMENT
;此处输入数据段代码
nameparlabelbyte
maxnlendb21
actnlendb?
_namedb21dup(?
);在MASM5.0下不能用name哦
phoneparlabelbyte
maxplendb9
actplendb?
phonedb9dup(?
)
crlfdb13,10,'$'
endaddrdw?
mess1db'Inputname:
','$'
mess2db'Inputatelephonenumber:
','$'
mess3db'Doyouwantatelephonenumber?
(Y/N)','$'
mess4db'name?
','$'
mess5db'name',16dup(''),'tel',0dh,0ah,'$'
mess6db'Notinthetable.',0dh,0ah,'$'
mess7db'Invalidinput!
',0dh,0ah,'$'
countdb0
tel_tabdb50dup(20dup(''),8dup(''))
tempdb20dup(''),8dup(''),0dh,0ah,'$'
swappeddb0
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
mainprocfar
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
pushds
subax,ax
pushax
MOVAX,DATAS
MOVDS,AX
moves,ax
cld
leadi,tel_tab;di中存放表首地址
;此处输入代码段代码
inputloop:
;提示'Inputname'
movah,09h
leadx,mess1
int21h
;
callinput_name
cmpactnlen,0;没有输入人名时
jza10;直接跳到提示是否查找的地方
cmpcount,50;输入上限
jea10
callstor_name;保存人名到tel_tab
;提示'Inputatelephonenumber'
movah,09h
leadx,mess2
int21h
;
callinput_stor_phone;输入并保存电话号码
jmpinputloop
a10:
cmpcount,1
jbesearchloop;如果没有输入或者输入一个
callname_sort;排序
searchloop:
leadx,mess3
movah,09h
int21h
movah,01h
int21h
cmpal,'N'
jeexit
cmpal,'n'
jeexit
cmpal,'Y'
jeshowname
cmpal,'y'
jeshowname
movah,09
leadx,crlf
int21h
leadx,mess7;非法输入
movah,09h
int21h
jmpsearchloop
showname:
movah,09
leadx,crlf
int21h
leadx,mess4;当输入Y时,显示'name?
'
movah,09
int21h
callinput_name;输入要查找的人名
callname_search;查找
callprintline
jmpsearchloop
exit:
ret
mainendp
;******************************************************
input_nameprocnear
movah,0ah
leadx,namepar
int21h
movah,02h
movdl,0ah;换行
int21h
movbh,0
movbl,actnlen
movcx,21
subcx,bx
i20:
mov_name[bx],20h
incbx
loopi20
ret
input_nameendp
;*********************************************************
stor_nameprocnear
inccount
cld
leasi,_name
movcx,10;把name中的前20个字符放入tel_tab中每一个人信息的前20个byte中
repmovsw
ret
stor_nameendp
;*****************************************************
input_stor_phoneprocnear
movah,0ah
leadx,phonepar
int21h
movah,02h
movdl,0ah;换行
int21h
movbh,0
movbl,actplen
movcx,9
subcx,bx;计算剩下的长度
is20:
movphone[bx],20h;剩下的地方填充空格
incbx
loopis20
cld
leasi,phone
movcx,4;把phone中的前8个字符放入tel_tab中每一个人信息的后8个byte中
repmovsw
ret
input_stor_phoneendp
;*****************************************************************
name_sortprocnear
subdi,56;仔细想想为什么是这样的
movendaddr,di
ns10:
movswapped,0
leasi,tel_tab
ns20:
movcx,20
movdi,si
adddi,28;下一个被比较的名字
movax,di
movbx,si
repecmpsb
jbens30;小于或等于不用交换
callnpxchg
ns30:
movsi,ax
cmpsi,endaddr
jbens20
cmpswapped,0
jnzns10
ret
name_sortendp
;*****************************************************
npxchgprocnear
movcx,14
leadi,temp
movsi,bx
repmovsw;moveloweritemtosave
movcx,14
movdi,bx
repmovsw
movcx,14
leasi,temp
repmovsw
movswapped,1
ret
npxchgendp
;************************************************************
disp_allprocnear
movah,09h
leadx,mess5
int21h
leasi,tel_tab
da10:
leadi,temp
movcx,14
repmovsw
movah,09h
leadx,temp
int21h
deccount
jnzda10
ret
disp_allendp
;*********************************************
name_searchprocnear
leasi,tel_tab
movbx,si
addendaddr,28
nase10:
leadi,_name;存放待查找的人名地址
movcx,10
repecmpsw
jcxznase_exit;相等
addbx,28;表中下一个比较的人名
movsi,bx
cmpsi,endaddr
jbenase10
notintab:
movcx,-1
ret
nase_exit:
movsi,bx
leadi,temp
movcx,14
repmovsw
ret
name_searchendp
;*******************************************************
printlineprocnear
cmpcx,-1
jenorecord
movah,09h
leadx,mess5
int21h
movah,09h
leadx,temp
int21h
ret
norecord:
movah,09h
leadx,mess6
int21h
ret
printlineendp
MOVAH,4CH
INT21H
CODESENDS
ENDmain
(4)实验结果(实验的运行结果)
三、课程设计(综合实验)总结或结论
这是我第一次使用汇编语言编程,因为程序是给出的所以运行成功。
我练习了使用DEBUG有关命令的使用方法。
虽然比较难理解
四、参考文献
注意:
要求打印,不要相互抄袭