汇编语言程序设计报告.docx
- 文档编号:6826383
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:35
- 大小:145.87KB
汇编语言程序设计报告.docx
《汇编语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计报告
综合实验报告
(2014--2015年度第一学期)
名称:
《汇编语言程序设计》综合实验
题目:
汇编语言程序设计
院系:
控制与计算机工程学院
班级:
计科1203
学号:
201209010324
学生姓名:
张毅民
指导教师:
王保义王蓝婧
设计周数:
一周
成绩:
日期:
2015年1月
实验一用表格形式显示字符
一、实验要求
按15*16列的表格形式显示ASCⅡ码为10H—100H的所有字符,即以行为主的顺序及ASCⅡ码递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符隔开。
二、设计思路
1.设两个计数值,行和列,分别为15、16,输出一个字符,输出一个空格,字符加1,判断是否输完一行,未输出完继续输出字符。
每行输完后,输出回车换行符,判断是否输玩15行,未输出完,从新输出新的一行。
2.流程图
三、设计要点、细节
(1)显示每个字符可使用功能号为02的显示输出功能调用:
Movah,02h
Movdl,输出字符的ASCⅡ码
Int21h
将dl初始化为10H,然后使用其加1以取得下一个字符的ASCⅡ码。
(2)显示空白符是,用其ASCⅡ码置0入dl寄存器。
每行结束时,用回车和换行来结束本行并开始下一行。
(3)由于逐个显示相继的ASCⅡ码字符是,需要不断修改dl寄存器的内容,而显示空白、回车、换行也需要使用dl寄存器,为此可使用堆栈保存dx。
(即pushpop指令)
四、实验程序及调试结果
CODESSEGMENT
;**********************************************
ASSUMECS:
CODES
START:
Movbx,15
movdl,10h
loop:
movcx,16
next:
movah,02h
int21h
incdl
;-----------------输出空格
pushdx
movdl,0
int21h
popdx
loopnext;未输完一行继续输出
;--------------每行输完,输出换行回车
pushdx
movdl,0dh
int21h
movdl,0ah
int21h
popdx
decbx
jneloop;未输完15行从新输入下一行
exit:
ret
CODESENDS
ENDSTART
五、实验结果
六、实验心得
本次实验是我初次实际上机编写汇编实验,实验很简单,但在编写中出现大大下小不少问题,在修改程序的过程中也渐渐熟悉了MASM软件,并且也简单了解了调试功能。
本次实验我具体地了解到了如何输出单个字符(及2号功能调用DOS),也熟悉了用堆栈保存信息,并简单了解了循环程序设计。
实验二查找匹配字符串
一、实验要求
程序接受用户键入的一个关键字以及一个句子,如果句子中不包含关键字则显示“Nomatch!
”;如果句子中包含关键字则显示“match!
”,且把该字在句子中的位置用十六进制数显示出来。
要求程序的执行过程如下:
Enterkeyword:
abc
Entersentence:
wearestudyingabc
Matchatlocation:
11Hofthesentence
Entersentence:
xyz
Nomatch!
Entersentence:
二、设计思路
1.输入关键字和一个句子,分别存入相应的缓冲区中(用功能调用2ah)。
在句子中查找关键字用串比较命令cmpsb并加前缀repnz,SI为寄存器为关键字的指针,DI为寄存器为句子中正相比较的字段的指针,CX为寄存器存放关键字的字母个数(长度),整个句子和关键字的比较过程可以用一个循环结构来完成,循环次数为:
(句子长度-关键字长度)+1;在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“nomatch”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。
比较完成有两种情况一种为句子比较完成,一种为在句子中找到与关键字相同的段,两种区别就是cx是否为零,为零则match。
最后再用二进制转换十六进制将bx的数显示出来,即为关键字在句子中的位置。
2.流程图
三、设计细节、要点
(1)输入关键字和一个句子,分别存入相应的缓冲区中。
可用功能调用0AH。
(2)在句子中查找关键字:
关键字和句子中相应字段的比较可使用串比较指令。
为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,相应的寄存器内容也有了确定的含义,即如下:
SI寄存器为关键字的指针
DI寄存器为句子中正相比较的字段的指针
CX寄存器存放关键字的字母个数(长度)
整个句子和关键字的比较过程可以用一个循环结构来完成,循环次数为:
(句子长度-关键字长度)+1
在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“nomatch”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。
输出信息:
用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。
在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制。
三、实验程序
DATASSEGMENTpara'data'
mess1db'match!
',13,10,'$'
mess2db'nomatch!
',13,10,'$'
mess3db'enterkeyword:
','$'
mess4db'entersentence:
','$'
mess5db'matchatlocation:
','$'
mess6db'Hofthesentence','$'
stoknimlabelbyte
maxdb10
actdb?
stokndb10dup(?
)
sentencelabelbyte
madb100
acdb?
stodb100dup(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,es:
datas
START:
pushds
subax,ax
pushax
MOVAX,DATAS
MOVDS,AX
moves,ax
;*****************输入关键字和一个句子***********
k:
leadx,mess3
movah,09
int21h;显示字符串‘enterword’
leadx,stoknim
movah,0ah
int21h;输入关键字到缓冲区Word
pushdx
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h;回车换行
popdx
d:
leadx,mess4
movah,09
int21h;显示字符串‘entersentence’
leadx,sentence
movah,0ah
int21h;输入句子到缓冲区sentence
pushdx
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h;回车换行
popdx
;****************比较查找信息********************
leasi,stoknim;si指向关键字
leadi,sentence;di指向句子
movax,0
movbl,1;初始化bx
movcl,0;初始化外循环计数单元
moval,act
movah,ac
subah,al
addah,1
movcl,ah;cl中循环次数
cmpcl,0
jenomatch
a:
pushcx
movcl,al
repnzcmpsb
jzmatch
subdi,1
subsi,2
addbl,1
popcx
deccl
cmpcl,0
jnea
jenomatch
;***************输出信息*************************
match:
leadx,mess1
movah,09h
int21h;显示match
pushdx
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h;回车换行
popdx
leadx,mess5
movah,09h
int21h;显示matchatlocation
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlp
addal,7h
p:
movdl,al
movah,02h
int21h
leadx,mess6
movah,09h
int21h
pushdx
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h;回车换行
popdx
jmpwer
nomatch:
leadx,mess2
movah,09h
int21h;显示nomatch
pushdx
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h;回车换行
popdx
wer:
jmpd
mainendp
CODESENDS
ENDSTART
五、实验结果
六、实验心得
本次是汇编第二个实验,相比第一个实验有更大难度,但是实验内容也有一定实际意义,这次编写代码比较费时费力但也收益良多。
具体地在实验中学习使用了带前缀地串比较,学会了如何在一段字符中查找目标字符。
更熟练地使用了循环程序设计,在句子位置显示部分也参照课本使用了二进制到十六进制转换,这方面知识掌握的更深入了。
这次由于时间所限,所写代码并不是十分完善,关于后续的改进,我有以下想法,上述程序,只能查找到句子中的首个关键字,即当出现关键字为a,句子为abca时,只能找到第一个a。
是由于程序设计中,当串比较match后,程序退出。
所以我的改进为在显示match及在句子中位置后,继续从上述位置继续比较,一直把句子比较完才退出程序。
这样会找到句子中所有关键字位置,更有实用价值。
实验三分类统计字符个数
一、实验要求
程序接受用户键入一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字、其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。
二、设计思路
1.先用01H功能调用接收一个字符,对照ASCⅡ码一步一步分类将各字符分入不同种类中并计数,最后用十进制数将各类字符数显示出来
2.流程图
三、实验程序
DATASSEGMENT
string1DB'InputYourString:
$';输入提示信息
string2DB'Digit:
$';各类字符提示信息
string3DB'ALetter:
$'
string5DB'bLetter:
$'
string4DB'Others:
$'
digitDB0;数字
letterDB0;字母
othersDB0;其他
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
movax,datas
movds,ax
leadx,string1;显示输入提示信息
movah,9
int21h
movcx,80;设置循环次数
L1:
movah,01h;中断调用,单字符输入
int21h
cmpal,0dh;若输入回车符则结束
jzover
cmpal,30h
jbOTHER;若<30H(0),others++
cmpal,39h;若>39H(9),跳转进一步比较
jaHIGHER1
jmpDIGITAL;digit++
HIGHER1:
cmpal,41h;if<41H(A),others++
jbOTHER
cmpal,5ah;if>5ah(Z),跳转继续比较
jaHIGHER2
jmpLETTER1HIGHER2:
cmpal,61h;if<61H(a),others++
jbOTHER
cmpal,7ah;if>7AH(z),others++
jaOTHER
jmpLETTER1;etter++
OTHER:
;others++
incothers
loopL1
DIGITAL:
;digit++
incdigit
loopL1
ALETTER1:
;letter++
incAletter
loopL1
OVER:
callENDLINE;回车换行
leadx,string2;输出数字个数
movah,9
int21h
xorax,ax
moval,digit;将统计的数字送AL,为输出做准备
callDISPLAY;调用输出两位数字的子程序
callENDLINE
leadx,string5;输出字母个数
movah,9
int21h
xorax,ax
moval,bletter
callDISPLAY
callENDLINE
leadx,string4;输出其他字符个数
movah,9
int21h
xorax,ax
moval,others
callDISPLAY
movah,4ch
int21h
ENDLINEPROCNEAR;控制输出格式,输出回车换行子程序
movah,2
movdl,0ah;换行
int21h
movah,2
movdl,0dh;回车
int21h
ret
ENDLINEENDP
DISPLAYPROCNEAR;输出两位数字的子程序
movbl,10;10送BL
divbl;AX/BL,AL=商,AH=余数
pushax;保存AX中的信息
movdl,al
adddl,30h
movah,2
int21h;输出十位数
popax;出栈送AX
movdl,ah
adddl,30h
movah,2
int21h;输出个位数
ret
DISPLAYENDP
CODESENDS
四、实验结果
五.实验心得
这次实验目的主要是学会分支程序设计,虽然分类繁琐,可是我感觉本次实验并不是太难
在实验中定义了letter,digit,others三个存储单元用于记录每种符号个数。
在内循环中,找出字符串属于哪类,通过与相应的ASCII码进行比较来确定相应的类别,通过比较和跳转来对不同类别的符号计数。
通过改变跳转条件可以获得更加详细的分类结果。
本次实验成功实现了题目的要求,可以统计输入字符类别的个数。
本次试验中得到的结果仍需调用相应程序将二进制数转换为十六进制并显示出来。
本实验的重点在分类,通过分支程序的角度来解决问题使问题得到简化。
实验四查找电话号码
一、实验要求
(1)要求程序建立一个可存放50项的电话号码表,每项包括人名及电话号码两部分;
(2)程序可接受输入人名及相应的电话号码,并把它们加入电话号码表中;
(3)凡有新的输入后,程序可按人名对电话号码表重新排序;
(4)程序可接受需要查询电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
Nametel
××××××××
二、设计说明
(1)显示提示符’Inputname:
’;
(2)调用子程序input_name接收人名;
(3)调用子程序stor_name把人名存入电话号码表tel_tab中:
(4)显示提示符’Inputatelephonenumber:
’;
(5)调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中;
(6)如输入已结束则调用name_sort子程序对电话号码表接人名排序;
(7)显示提示符’Doyouwantatelephonenumber?
(Y/N)’;
(8)回答N收退出程序;
(9)回答Y则再显示提示符’name?
’;
(10)调用子程序input_name接收人名;
(11)调用子程序name_search在电话号码表中查找所要的电话号码;
(12)调用子程序printline按要求格式显示人名及电话号码;
(13)重复查号提示符直至用户不要求查号为止。
三、设计思路
1.模块图
2.主要模块流程图
四、模块说明
模块名
输入
输出
功能
main总控制模块
用户的各种操作选择
如选择是否继续插入,继续查询等
各种提示信息,如提示输入姓名、号码、提示是否继续操作
建立联系人号码表,对号码表人名排序,提供查询、显示功能
input_name
联系人的姓名到tname缓冲区
无
读入姓名到tname缓冲区并把不满20位部分补空格
name_search
tname缓冲区的姓名
查找结果放在bx寄存器
在号码表查找tname缓冲区的姓名,找到则bx存放该记录的地址,否则(bx)=-1
crlf
无
回车换行
输出回车换行
stor_name
tname缓冲区的姓名
把tname缓冲区的姓名移动到号码表,对应记录数tab_len增1,endaddr增28
把姓名从缓冲区移动到号码表
inphone
电话号码
把inphone缓冲区的号码移动到号码表中
读入电话号码并转存到号码表中
name_sort
从tab_len取出记录数,从endaddr取出最后一个记录地址。
号码表中只有最后一个记录无序,前面记录有序
排序
对号码表进行排序(用插入排序,每次输入一个联系人后进行排序)
print_all
号码表的地址
无
显示号码表中的所有电话号码
printline
要显示的联系人地址存放在bx
无
显示单个联系人的信息
五、实验程序
datasegsegment
nameparlabelbyte
maxnlendb21
actnlendb?
_namedb21dup(?
)
phoneparlabelbyte
maxplendb9
actplendb?
phonedb9dup(?
)
crlfdb13,10,'$'
endaddrdw?
mess1db'entername:
','$'
mess2db'enteratelephonenumber:
','$'
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
datasegends
;**********************************************************************
codesegsegment
mainprocfar
assumecs:
codeseg,ds:
dataseg,es:
dataseg
start:
pushds
subax,ax
pushax
movax,dataseg
movds,ax
moves,ax;
cld
leadi,tel_tab;di中存放表首地址
inputloop:
movah,09h
leadx,mess1
int21h
callinput_name
cmpactnlen,0;没有输入人名时
jza1;直接跳到提示是否查找的地方
cmpcount,50;输入上限
jea1
callstor_name;保存人名到tel_tab
movah,09h
leadx,mess2
int21h
callinput_stor_phone;输入并保存电话号码
jmpinputloop
a1:
cmpcount,1
jbesearchloop;如果没有输入或者输入一个
callname_sort;排序
calldisp_all;显示所有
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;当输入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)