IBMPC汇编语言程序实验报告Word文档下载推荐.docx
《IBMPC汇编语言程序实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序实验报告Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
把dx推进栈保存
movdl,0;
显示空白符
popdx;
把dx之前的数取回来
looploop1;
当cx=0时会自动跳出loop1循环
保存dx的数,即为了保存ascii码
movdl,0ah;
显示回车
int21h;
02的显示输出功能调用
movdl,0dh;
显示换行符
int21h
popdx;
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
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
输出msg4
leadx,sentence
输入句子
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
addsi,2
cld
repzcmpsb
jzmatch1
cmpdi,bx
jbesign1
nomatch1:
leadx,nomatch
int21h
jmpagain
match1:
leadx,match
subdi,dx
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
decch
jnzrotate
leadx,msg5
movah,09h
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
codes,ds:
movax,datas
movds,ax
leadx,string
movah,0ah
leadi,string+2
movcl,string+1
adddx,2
again:
moval,[di]
cmpal,0dh
jzexit
cmpal,30h
jbother2;
其他
cmpal,39h
jbedigital2;
数字
cmpal,41h
cmpal,5ah
jbeletter2;
字母
cmpal,61h
cmpal,7ah
jbletter2;
other2:
incother
incdi
jmpagain
digital2:
incdigit
letter2:
incletter
callcrlf
leadx,letter1
movah,09
xorax,ax
moval,letter
calldisplay
leadx,digit1
moval,digit
leadx,other1
moval,other
movah,4ch
子程序display,用于将二进制数转换成十进制数
movbl,10
divbl
pushax
movdl,al
adddl,30h
movah,2
popax
movdl,ah
displayendp
crlfprocnear
movah,02
movdl,0dh
movdl,0ah
crlfendp
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.'
mess7db'
Invalidinput!
countdb0
tel_tabdb50dup(20dup('
),8dup('
))
tempdb20dup('
),0dh,0ah,'
swappeddb0
datasegends
**********************************************************************
codesegsegment
codeseg,ds:
dataseg,es:
dataseg
pushds
subax,ax
pushax
movax,dataseg
movds,ax
moves,ax;
cld
leadi,tel_tab;
di中存放表首地址
inputloop:
movah,09h
leadx,mess1
callinput_name
cmpactnlen,0;
没有输入人名时
jza1;
直接跳到提示是否查找的地方
cmpcount,50;
输入上限
jea1
callstor_name;
保存人名到tel_tab
leadx,mess2
callinput_stor_phone;
输入并保存电话号码
jmpinputloop
a1:
cmpcount,1
jbesearchloop;
如果没有输入或者输入一个
callname_sort;
排序
calldisp_all;
显示所有
searchloop:
leadx,mess3
movah,01h
cmpal,'
N'
jeexit
n'
Y'
jeshowname
y'
jeshowname
leadx,crlf
leadx,mess7;
非法输入
jmpsearchloop
showname:
leadx,mess4;
当输入Y时,显示'
callinput_name;
输入要查找的人名
callname_search;
查找
callprintline
jmpsearchloop
ret
******************************************************
input_nameprocnear
movah,0ah
leadx,namepar
输入名字
movdl,0ah
换行
movbh,0;
bx高位置0
movbl,actnlen;
bx低位置输入名字个数
movcx,21
subcx,bx;
计算剩下的长度
i1:
mov_name[bx],20h
incbx
loopi1;
把bx之后剩下的填充空格
input_nameendp
*********************************************************
stor_nameprocnear
inccount;
有人名输入所以个数加1
cld
leasi,_name;
把si指向刚才输入名字的位置
movcx,10;
把name中的前20个字符放入tel_tab中每一个人信息的前20个byte中
repmovsw;
把si所指名字赋值给di所指地方tel_tab
stor_nameendp
*****************************************************
input_stor_phoneprocnear
leadx,phonepar
把电话号码存入phonrpar
换行
movbh,0
movbl,actplen
movcx,9
s2:
movphone[bx],20h;
剩下的地方填充空格
loops2
leasi,phone;
再把名字放入之后di就已经移动到名字之后了
movcx,4;
把phone中的前8个字符放入tel_tab中每一个人信息的后8个byte中
repmovsw
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
name_sortendp
*****************************************************
npxchgprocnear
movcx,14;
交换名字和电话号码
leadi,temp
movsi,bx
moveloweritemtosave
movcx,14
movdi,bx
leasi,temp
repmovsw
movswapped,1
npxchgendp
************************************************************
disp_allprocnear
leadx,mess5
d1:
leadx,temp
deccount
jnzd1
disp_allendp
*********************************************
name_searchprocnear
addendaddr,28
e1:
leadi,_name;
存放待查找的人名地址
movcx,10
repecmpsw
jcxzexit3;
相等
addbx,28;
表中下一个比较的人名
jbee1
movcx,-1
exit3:
name_searchendp
*******************************************************
printlineprocnear
cmpcx,-1
jenorecord
输出name和tel
leadx,temp
输出名字和电话号码
norecord:
leadx,mess6
输出没找到
printlineendp
************************************************************
codesegends
四、使用说明
根据提示输入人名及电话号码,使用回车键表示输入结束,如不需输入人名,则在提示后直接输入回车键,表示输入完成,程序将自动显示电话号码表。
如需查询则可输入y(大小写均可),否则输入n(大小写均可)。
五、模块层次图及说明
(1)主函数main:
用来显示用户操作提示,调用子模块,使程序完成查找电话号码的过程;
(2)接收人名函数input_name:
输入人名,将此人名保存至缓冲区,并用空格补足剩余空间;
(3)保存人名函数stor_nam