IBMPC汇编语言程序实验报告.docx
- 文档编号:4373639
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:179.19KB
IBMPC汇编语言程序实验报告.docx
《IBMPC汇编语言程序实验报告.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
IBMPC汇编语言程序实验报告
华北电力大学
实验报告
名称:
汇编语言程序设计综合实验
院系:
信息工程系
班级:
网络工程10k1
学号:
学生姓名:
指导教师:
设计天数:
成绩:
日期:
年月日
实验一用表格形式显示ASCII字符
一、实验说明:
按15行X16列的表格显示表示ASCII码为10H—100H的所有字符,即以行为主的顺序及ASCII码递增的次序一次显示对应的字符。
每16个字符为一行,每行中的相邻来那个字符之间用空白(ASCII为0)隔开。
(1)显示每个字符可使用功能号为02的现实输出功能调用,使用方法如下:
movah,02h
movdl,输出字符的ASCII码
int21h
本题中可把dl初始化为10H,然后不断使其加1(用INC指令)以取得下一个字符的ASCII码。
(2)显示空白符时,用其ASCII码置入dl寄存器。
每行结束时,用显示回车(ASCII为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。
(3)由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而现实空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相机的ASCII字符。
具体使用方法:
在显示空白或回车、换行符前用指令
pushdx
把dl的内容保存到堆栈中去。
在现实空白或回车、换行符后用指令
popdx
恢复dl寄存器的原始内容。
二、程序代码:
codesegment
assumecs:
code
start:
movdx,0010h;初值为10h
next:
movcx,0010h;16列
loop1:
movah,02h;
int21h;显示输出dl字符
incdx;dx加1
pushdx;把dx推进栈保存
movdl,0;显示空白符
int21h
popdx;把dx之前的数取回来
looploop1;当cx=0时会自动跳出loop1循环
pushdx;保存dx的数,即为了保存ascii码
movdl,0ah;显示回车
int21h;02的显示输出功能调用
movdl,0dh;显示换行符
int21h
popdx;把dx之前的数取回来
cmpdx,100h;最后的字符的ascii码为100h,相比较
jbnext;小于时就跳会next
movah,4ch;带返回码终止
int21h
codeends
endstart
三、运行结果
实验二查找匹配字符串
一、实验说明
程序接受用户键入的一个关键字以及一个句子。
如果句子中不含关键字则显示‘nomatch’;如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来。
1)采用0AH功能调用将关键字和一个句子分别存入相应的缓冲区。
2)关键字的查找。
关键字和句子中相应字段的比较可使用串比较指令,因此定义附加段,附加段和数据段定义为同一段;相应寄存器内容如下:
SI寄存器:
关键字首指针;
DI寄存器:
句子中正相比较的字符指针;
CX寄存器(数据段的COUNT变量):
关键字的字母个数。
3)关键字在句子中位置的判断。
[DI-COUNT]即为关键字在句子中的地址,LEADXSENTENCE;SUBDI,DX;DECDI;此时DI中存放关键字的位置。
4)十六进制显示,采用循环移位,每次输出四个二进制位对应的十六进制字符。
二、程序代码
datassegment
keyworddb10h,?
10hdup(?
)
matchdb0ah,0dh,"matchatlocation:
$"
nomatchdb0ah,0dh,"nomatch$"
msg3db0ah,0dh,"enterkeyword:
$"
实验2程序流程图
sentencedb50h,?
50hdup(?
)
msg4db0ah,0dh,"entersentence:
$"
msg5db"hofthesentence!
$"
countdb?
datasends
codessegment
mainprocfar
assumecs:
codes,ds:
datas,es:
datas
start:
pushds
subax,ax
subcx,cx
subbx,bx
pushax
movax,datas
movds,ax
moves,ax
movch,0
leadx,msg3
movah,09h
int21h
leadx,keyword
movah,0ah
int21h;输入关键字
again:
leadx,msg4
movah,09h
int21h;输出msg4
leadx,sentence
movah,0ah
int21h;输入句子
leadi,sentence
leasi,keyword
moval,[di+1]
movcl,[si+1]
movcount,cl
movbl,al
subbl,cl
addbl,2
addbx,di
cmpal,cl
jbnomatch1
adddi,2
sign1:
movcl,count
leasi,keyword
addsi,2
cld
repzcmpsb
jzmatch1
cmpdi,bx
jbesign1
nomatch1:
leadx,nomatch
movah,09h
int21h
jmpagain
match1:
leadx,match
movah,09h
int21h
leadx,sentence
subdi,dx
movcl,count
subdi,cx
decdi
movbx,di
calldisplay
jmpagain
;子程序display,用于将二进制数转换成十六进制数
displayprocnear
movch,2
rotate:
movcl,4
rolbl,cl
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlprintit
addal,7h
printit:
movdl,al
movah,2
int21h
decch
jnzrotate
leadx,msg5
movah,09h
int21h
ret
displayendp
exit:
ret
mainendp
codesends
endstart
实验2.程序运行结果
实验三分类统计字符个数
一、实验说明:
程序接收用户键入的一行字符(用回车符结束),并按字母,数字及其他字符分类计数,然后将结果存入以letter,digit和other为名的存储单元中。
1)程序采用0AH功能调用把键入字符直接送到缓冲区,然后再逐个取出,比较字符的ASCⅡ码,分类计数。
2)程序需进入debug运行并查看计数结果。
3)十进制显示输出,数值存放在AL中,运用MOVBL,10;DIVBL;分别将十位和个位输出。
二、程序代码:
datassegment
stringdb80,?
80dup(?
)
letter1db0ah,0dh,"letter:
$"
digit1db0ah,0dh,"digit:
$"
other1db0ah,0dh,"other:
$"
letterdb0
digitdb0
otherdb0
datasends
codessegment
mainprocfar
assumecs:
codes,ds:
datas
start:
movax,datas
movds,ax
leadx,string
movah,0ah
int21h
leadi,string+2
movcl,string+1
adddx,2
again:
moval,[di]
cmpal,0dh
jzexit
cmpal,30h
jbother2;其他
cmpal,39h
jbedigital2;数字
cmpal,41h
jbother2;其他
cmpal,5ah
jbeletter2;字母
cmpal,61h
jbother2;其他
cmpal,7ah
jbletter2;字母
other2:
incother
incdi
jmpagain
digital2:
incdigit
incdi
jmpagain
letter2:
incletter
incdi
jmpagain
exit:
callcrlf
leadx,letter1
movah,09
int21h
xorax,ax
moval,letter
calldisplay
callcrlf
leadx,digit1
movah,09
int21h
xorax,ax
moval,digit
calldisplay
callcrlf
leadx,other1
movah,09
int21h
xorax,ax
moval,other
calldisplay
movah,4ch
int21h
mainendp
;子程序display,用于将二进制数转换成十进制数
displayprocnear
movbl,10
divbl
pushax
movdl,al
adddl,30h
movah,2
int21h
popax
movdl,ah
adddl,30h
movah,2
int21h
ret
displayendp
crlfprocnear
movah,02
movdl,0dh
int21h
movdl,0ah
int21h
ret
crlfendp
codesends
endstart
流程图
实验3程序运行结果
实验四查找电话号码
一、实验要求
(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)重复查号提示符直至用户不要求查号为止。
三、实验程序
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;当输入Y时,显示'name?
'
movah,09
int21h
callinput_name;输入要查找的人名
callname_search;查找
callprintline
jmpsearchloop
exit:
ret
mainendp
;******************************************************
input_nameprocnear
movah,0ah
leadx,namepar
int21h;输入名字
movdl,0ah
movah,02h
int21h;换行
movbh,0;bx高位置0
movbl,actnlen;bx低位置输入名字个数
movcx,21
subcx,bx;计算剩下的长度
i1:
mov_name[bx],20h
incbx
loopi1;把bx之后剩下的填充空格
ret
input_nameendp
;*********************************************************
stor_nameprocnear
inccount;有人名输入所以个数加1
cld
leasi,_name;把si指向刚才输入名字的位置
movcx,10;把name中的前20个字符放入tel_tab中每一个人信息的前20个byte中
repmovsw;把si所指名字赋值给di所指地方tel_tab
ret
stor_nameendp
;*****************************************************
input_stor_phoneprocnear
movah,0ah
leadx,phonepar
int21h;把电话号码存入phonrpar
movah,02h
movdl,0ah;换行
int21h
movbh,0
movbl,actplen
movcx,9
subcx,bx;计算剩下的长度
s2:
movphone[bx],20h;剩下的地方填充空格
incbx
loops2
cld
leasi,phone;再把名字放入之后di就已经移动到名字之后了
movcx,4;把phone中的前8个字符放入tel_tab中每一个人信息的后8个byte中
repmovsw
ret
input_stor_phoneendp
;*****************************************************************
name_sortprocnear
subdi,56
movendaddr,di
n1:
movswapped,0
leasi,tel_tab
n2:
movcx,20
movdi,si
adddi,28;下一个被比较的名字
movax,di
movbx,si
repecmpsb;比较20次
jben3;小于或等于不用交换
callnpxchg
n3:
movsi,ax
cmpsi,endaddr
jben2
cmpswapped,0
jnzn1
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
d1:
leadi,temp
movcx,14
repmovsw
movah,09h
leadx,temp
int21h
deccount
jnzd1
ret
disp_allendp
;*********************************************
name_searchprocnear
leasi,tel_tab
movbx,si
addendaddr,28
e1:
leadi,_name;存放待查找的人名地址
movcx,10
repecmpsw
jcxzexit3;相等
addbx,28;表中下一个比较的人名
movsi,bx
cmpsi,endaddr
jbee1
movcx,-1
ret
exit3:
movsi,bx
leadi,temp
movcx,14
repmovsw
ret
name_searchendp
;*******************************************************
printlineprocnear
cmpcx,-1
jenorecord
movah,09h
leadx,mess5
int21h;输出name和tel
movah,09h
leadx,temp
int21h;输出名字和电话号码
ret
norecord:
movah,09h
leadx,mess6
int21h;输出没找到
ret
printlineendp
;************************************************************
codesegends
endstart
四、使用说明
根据提示输入人名及电话号码,使用回车键表示输入结束,如不需输入人名,则在提示后直接输入回车键,表示输入完成,程序将自动显示电话号码表。
如需查询则可输入y(大小写均可),否则输入n(大小写均可)。
五、模块层次图及说明
(1)主函数main:
用来显示用户操作提示,调用子模块,使程序完成查找电话号码的过程;
(2)接收人名函数input_name:
输入人名,将此人名保存至缓冲区,并用空格补足剩余空间;
(3)保存人名函数stor_nam
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IBMPC 汇编语言 程序 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)