北京理工大学汇编实验报告3Word文件下载.docx
- 文档编号:5670964
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:22
- 大小:143.48KB
北京理工大学汇编实验报告3Word文件下载.docx
《北京理工大学汇编实验报告3Word文件下载.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验报告3Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
主要用在MOVS和STOS前。
一般不用在LODS前。
上述指令涉及的寄存器:
段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX。
涉及的标志位:
DF、AF、CF、OF、PF、SF、ZF。
三、实验步骤
1)编写程序,比较两个字符串BUF1和BUF2所含的字符是否相同,相同则AL返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。
提示:
输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。
2)编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。
从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。
3)编写程序,将内存中BUF1某一区域的数据传送到另一区域BUF2中,要求用字符串处理方法。
4)编写程序,在已知字符串中搜索特定字符‘#’,若找到则AL返回0,找不到AL返回1,要求用字符串处理方法。
5)编写程序,统计一串字符串中字符"
&
"
出现的次数,要求用字符串处理方法。
6)编写程序,设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Notfound”。
四、程序清单与框图
(1)
DATASSEGMENT
BUF1DB20,?
20DUP(?
)
COUNT1EQU$-BUF1
BUF2DB20,?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LEADX,BUF1;
输入字符串BUF1
MOVAH,0AH
INT21H
MOVDL,0AH;
输出回车、换行
MOVAH,02H
MOVDL,0DH
LEADX,BUF2;
输入字符串BUF2
INT21H
MOVAX,0
LEADI,BUF1
LEASI,BUF2
CLD
MOVCX,COUNT1
REPZCMPSB
JNZL1;
BUF1和BUF2不同,跳转至L1
L2:
MOVAL,0H
JMPEXID
L1:
MOVAL,1H
EXID:
MOVBL,AL
MOVDL,0AH;
MOVAH,02H
INT21H
MOVDL,0DH
ADDBL,30H;
将AL中的内容输出
MOVDL,BL
MOVAH,4CH
CODESENDS
ENDSTART
程序分析:
本程序的难点在于从键盘输入两字符串BUF1、BUF2。
为了成功输入,要在两次输入之间加上输出回车、换行。
初始化BUF1、BUF2内存区域时,应设置相同的空间大小便于后续比较BUF1、BUF2中的字符。
利用0A号功能进行输入字符串时,要注意初始化时的固定格式。
输入前应将字符串有效地址放入DX中。
利用串操作指令CMPSB逐个比较DS:
SI和ES:
DI中的字符。
利用CLD指令可以方便地使SI、DI在每次串操作指令后递增。
输出AL中的内容0、1时应先将其转换成ASCII码30H、31H再输出。
框图:
开始
初始化BUF1,BUF2内存单元
输入BUF1、BUF2字符串,设置SI、DI
循环次数CX设为字符串长度
比较DS:
DI中字符
N
结束
(2)
BUFDB'
12345678912345$'
BUF2DB20DUP('
$'
)
LEABX,BUF
LEASI,BUF
LEADI,BUF2
CLD
REPNZCMPSB
MOVAX,SI
SUBAX,BX;
计算BUF长度
MOVDX,0;
将AX中的内容转为10进制输出
MOVBX,10000
DIVBX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAX,BX
MOVBX,1000
MOVDX,0
MOVBX,100
MOVBX,10
MOVDL,BL
ENDSTART
本程序的难点在于将内存中的十六进制数转为十进制输出。
一个字能表示的最大十六进制数是65535,即十进制的五位数。
所以采用除10000、1000、100、10、1法,将商不断输出,再将余数作为下一次运算的被除数。
输出前要将原数加上30H转为ASCII码。
(3)
BUF1DB'
ABCDEFGHIJKLMN'
BUF2DB20DUP(?
LEASI,BUF1
REPMOVSB;
将BUF1中数据复制到BUF2中
本程序使用的串操作指令是MOVSB,该指令的功能为把DS:
SI指向的存储单元中的数据装入ES:
DI指向的存储单元中,然后根据DF标志分别增减SI和DI。
利用该指令可以方便地将BUF1内存单元中的内容复制到BUF2内存单元中。
装载DS、ES段,设置SI、DI
循环次数CX设为BUF1长度
(4)
MOVAL,'
#'
REPNZSCASB
JZL1
JNZL2
MOVAL,0
JMPEXID
MOVAL,1
EXID:
本程序使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
本程序要实现的功能是查找字符'
所以可将AL中的数据设置为'
。
若一次循环过程中ZF=1,即说明原字符串BUF1中也含有字符'
初始化BUF1内存单元
装载ES段,设置DI
DI加一,CX减一
(5)
YYYSS22323&
g&
'
COUNTEQU$-BUF1
ASSUMECS:
MOVBX,0
MOVCX,COUNT
L:
;
统计‘&
’个数
REPNZSCASB
JZFOUND
FOUND:
发现一个‘&
’
INCCX
INCBX
LOOPL
本程序的目的是统计字符串中'
的个数。
使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
在循环中,若ZF=1,计数器BX便自增一,这样便实现了统计'
个数的目的。
装载ES段,设置DI,BX清0
BX加一
CX加一
(6)
STRBUFDB'
COUNT1EQU$-STRBUF
FOUND$'
BUF2DB'
NOTFOUND$'
LEADI,STRBUF
找到了‘#’字符,输出FOUND。
MOVAH,9H
没找到‘#’字符,输出NOTFOUND。
本程序与(4)很类似。
若一次循环过程中ZF=1,即说明原字符串STRBUF中也含有字符'
查找到则输出'
FOUND'
为了输出'
字符串,应提前将其放在内存中,并以$作为串的结束。
先将其有效地址放入DX中,再利用9号功能输出。
若未查找到则输出'
NOTFOUND'
五、实验结果与分析
BUF1与BUF2相同,AL返回0。
BUF1与BUF2不同,AL返回1。
共15个字符(含$)
可看出BUF1已经复制到BUF2内存区域中。
字符串不含‘#’,结果:
AL=1
字符串含‘#’,结果:
AL=0
BX=000A共10个'
字符串含有‘#’,输出FOUND。
字符串不含有‘#’,输出NOTFOUND。
六、实验感想
本次实验为字符串操作,实验内容较多,并且在之前的课堂上没有涉及过。
经过本次实验,我掌握了串操作指令的寻址方式及使用方法,学会编写常用的字符串处理程序,了解汇编语言字符串处理基本流程。
主要使用的串操作指令如下:
MOVSB,其功能是把DS:
SCASB把AL中的数据与ES:
CMPSB:
SI指向的存储单元中的数据与ES:
CLD指令可以方便地使DI和SI在每次串操作指令后递增一。
同时也学习了DOS功能中的2号、9号、0A号功能。
2号功能为输出一个字符,使用前应先将要显示的字符的ASCII码放入DL中,注意数字的ASCII码是在原数上加30H。
9号功能为输出字符串,字符串的有效地址应提前放入DX中,并以$作为字符串的结束。
0A号功能为输入字符串,要特别注意定义字符串时的特殊格式,例如BUFDB20,?
20DUP(?
)。
输入前也要将字符串的有效地址放入DX中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 汇编 实验 报告