北京理工大学汇编实验分析报告.docx
- 文档编号:25395272
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:23
- 大小:173.42KB
北京理工大学汇编实验分析报告.docx
《北京理工大学汇编实验分析报告.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验分析报告.docx(23页珍藏版)》请在冰豆网上搜索。
北京理工大学汇编实验分析报告
北京理工大学汇编实验报告
————————————————————————————————作者:
————————————————————————————————日期:
本科实验报告
实验名称:
实验三字符串操作实验
课程名称:
课程设计Ⅰ(CPU与汇编)(实验)
实验时间:
第5-10周周五下午
任课教师:
聂青
实验地点:
10-102
实验教师:
苏京霞
实验类型:
☑原理验证
□综合设计
□自主创新
学生姓名:
罗逸雨
学号/班级:
112014120805211401
组号:
3
学院:
信息与电子学院
同组搭档:
专业:
通信工程
成绩:
一、实验目的
1)熟悉串操作指令的功能与应用;
2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;
3)了解汇编语言字符串处理基本流程;
二、实验环境与原理
1.实验软硬件环境
1)硬件环境:
惠普64位一体化计算机及局域网;
2)软件环境:
Windows8,红蜘蛛管理系统,MASMforWindows。
2.实验原理
1)字符串操作流程
SI寄存器保存源串首地址;
DI寄存器保存目的串首地址;
CX寄存器保存字符串长度;
CLD或STD指令设置字符串处理方向;
当CLD指令使DF=0在执行串处理指令时可使地址自动增量;STD使DF=1,在执行串处理指令时可使地址自动减量。
2)重复前缀指令
重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX中值减至0时,停止重复执行,继续执行下一条指令。
当REP无条件重复前缀,重复串操作直到计数寄存器的内容CX为0为止。
经常与REP配合工作的字符串处理指令有MOVS、STOS和LODS。
当REPE/REPZ判断计数寄存器的内容CX是否为0或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。
当REPNE/REPNZ判断计数寄存器的内容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。
3)字符串操作指令
lodsb、lodsw:
把DS:
SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI;
stosb、stosw:
把AL或AX中的数据装入ES:
DI指向的存储单元,然后根据DF标志增减DI;
movsb、movsw:
把DS:
SI指向的存储单元中的数据装入ES:
DI指向的存储单元中,然后根据DF标志分别增减SI和DI;
scasb、scasw:
把AL或AX中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;
cmpsb、cmpsw:
把DS:
SI指向的存储单元中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;
rep:
重复其后的串操作指令。
重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。
主要用在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,?
20DUP(?
)
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
INT21H
MOVDL,0DH
MOVAH,02H
INT21H
LEADX,BUF2;输入字符串BUF2
MOVAH,0AH
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
MOVAH,02H
INT21H
ADDBL,30H;将AL中的内容输出
MOVDL,BL
MOVAH,02H
INT21H
MOVAH,4CH
INT21H
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:
SI和ES:
DI中字符
N
结束
(2)
DATASSEGMENT
BUFDB'12345678912345$'
BUF2DB20DUP('$')
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
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
MOVAH,02H
INT21H
MOVAX,BX
MOVBX,1000
MOVDX,0
DIVBX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H
MOVAX,BX
MOVDX,0
MOVBX,100
DIVBX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H
MOVAX,BX
MOVBX,10
MOVDX,0
DIVBX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H
MOVDL,BL
ADDDL,30H
MOVAH,02H
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序分析:
本程序的难点在于将内存中的十六进制数转为十进制输出。
一个字能表示的最大十六进制数是65535,即十进制的五位数。
所以采用除10000、1000、100、10、1法,将商不断输出,再将余数作为下一次运算的被除数。
输出前要将原数加上30H转为ASCII码。
(3)
DATASSEGMENT
BUF1DB'ABCDEFGHIJKLMN'
COUNT1EQU$-BUF1
BUF2DB20DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LEASI,BUF1
LEADI,BUF2
CLD
MOVCX,COUNT1
REPMOVSB;将BUF1中数据复制到BUF2中
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序分析:
本程序使用的串操作指令是MOVSB,该指令的功能为把DS:
SI指向的存储单元中的数据装入ES:
DI指向的存储单元中,然后根据DF标志分别增减SI和DI。
利用该指令可以方便地将BUF1内存单元中的内容复制到BUF2内存单元中。
框图:
开始
初始化BUF1,BUF2内存单元
装载DS、ES段,设置SI、DI
循环次数CX设为BUF1长度
将DS:
SI中的内容复制到ES:
DI中
SI加一
DI加一CX减一
结束
(4)
DATASSEGMENT
BUF1DB'ABCDEFGHIJKLMN'
COUNT1EQU$-BUF1
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAL,'#'
LEADI,BUF1
CLD
MOVCX,COUNT1
REPNZSCASB
JZL1
JNZL2
L1:
MOVAL,0
JMPEXID
L2:
MOVAL,1
EXID:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序分析:
本程序使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
本程序要实现的功能是查找字符'#',所以可将AL中的数据设置为'#'。
若一次循环过程中ZF=1,即说明原字符串BUF1中也含有字符'#'。
框图:
开始
初始化BUF1内存单元
装载ES段,设置DI
循环次数CX设为字符串长度
DI加一,CX减一
N
结束
(5)
DATASSEGMENT
BUF1DB'&YYYSS22323&&&&&&&g&&'
COUNTEQU$-BUF1
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVBX,0
LEADI,BUF1
MOVCX,COUNT
MOVAL,'&'
CLD
L:
;统计‘&’个数
REPNZSCASB
JZFOUND
JMPEXID
FOUND:
;发现一个‘&’
INCCX
INCBX
LOOPL
EXID:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序分析:
本程序的目的是统计字符串中'&'的个数。
使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
本程序要实现的功能是查找字符'&',所以可将AL中的数据设置为'&'。
在循环中,若ZF=1,计数器BX便自增一,这样便实现了统计'&'个数的目的。
开始
初始化BUF1内存单元
装载ES段,设置DI,BX清0
循环次数CX设为字符串长度
BX加一
CX加一
结束
(6)
DATASSEGMENT
STRBUFDB'ABCDEFGHIJKLMN'
COUNT1EQU$-STRBUF
BUF1DB'FOUND$'
BUF2DB'NOTFOUND$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAL,'#'
LEADI,STRBUF
CLD
MOVCX,COUNT1
REPNZSCASB
JZL1
JNZL2
L1:
LEADX,BUF1;找到了‘#’字符,输出FOUND。
MOVAH,9H
INT21H
JMPEXID
L2:
LEADX,BUF2;没找到‘#’字符,输出NOTFOUND。
MOVAH,9H
INT21H
JMPEXID
EXID:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序分析:
本程序与(4)很类似。
使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
本程序要实现的功能是查找字符'#',所以可将AL中的数据设置为'#'。
若一次循环过程中ZF=1,即说明原字符串STRBUF中也含有字符'#'。
查找到则输出'FOUND'。
为了输出'FOUND'字符串,应提前将其放在内存中,并以$作为串的结束。
先将其有效地址放入DX中,再利用9号功能输出。
若未查找到则输出'NOTFOUND'。
五、实验结果与分析
(1)
BUF1与BUF2相同,AL返回0。
BUF1与BUF2不同,AL返回1。
(2)
BUFDB'12345678912345$'
共15个字符(含$)
(3)
BUF1DB'ABCDEFGHIJKLMN'
BUF2DB'ABCDEFGHIJKLMN'
可看出BUF1已经复制到BUF2内存区域中。
(4)
字符串不含‘#’,结果:
AL=1
字符串含‘#’,结果:
AL=0
(5)
BX=000A共10个'&'
(6)
字符串含有‘#’,输出FOUND。
字符串不含有‘#’,输出NOTFOUND。
六、实验感想
本次实验为字符串操作,实验内容较多,并且在之前的课堂上没有涉及过。
经过本次实验,我掌握了串操作指令的寻址方式及使用方法,学会编写常用的字符串处理程序,了解汇编语言字符串处理基本流程。
主要使用的串操作指令如下:
MOVSB,其功能是把DS:
SI指向的存储单元中的数据装入ES:
DI指向的存储单元中,然后根据DF标志分别增减SI和DI。
SCASB把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
CMPSB:
把DS:
SI指向的存储单元中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
CLD指令可以方便地使DI和SI在每次串操作指令后递增一。
同时也学习了DOS功能中的2号、9号、0A号功能。
2号功能为输出一个字符,使用前应先将要显示的字符的ASCII码放入DL中,注意数字的ASCII码是在原数上加30H。
9号功能为输出字符串,字符串的有效地址应提前放入DX中,并以$作为字符串的结束。
0A号功能为输入字符串,要特别注意定义字符串时的特殊格式,例如BUFDB20,?
20DUP(?
)。
输入前也要将字符串的有效地址放入DX中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 汇编 实验 分析 报告