北京理工大学汇编实验报告3Word下载.docx
- 文档编号:17866227
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:14
- 大小:44.19KB
北京理工大学汇编实验报告3Word下载.docx
《北京理工大学汇编实验报告3Word下载.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验报告3Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
惠普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(即比较的两个操作数相等,只要满足一个则重复执行结束,否则继续执行。
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:
SI指向的存储单元中的数据与ES:
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,?
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
MOVAX,0
LEADI,BUF1
LEASI,BUF2
CLD
MOVCX,COUNT1
REPZCMPSB
JNZL1;
BUF1和BUF2不同,跳转至L1
L2:
MOVAL,0H
JMPEXID
L1:
MOVAL,1H
EXID:
MOVBL,AL
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再输出。
框图:
相同且CX不为0?
结束
初始化BUF1,BUF2内存单元循环次数CX设为字符串长度SI、DI加一,CX减一输入BUF1、BUF2字符串,设置SI、DI
比较DS:
DI中字符
NAL=0开始ZF=1?
N
YY
AL=1
(2
BUFDB'
12345678912345$'
BUF2DB20DUP('
$'
DATASSTART:
LEABX,BUF
LEASI,BUF
LEADI,BUF2
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
本程序的难点在于将内存中的十六进制数转为十进制输出。
一个字能表示的最大十六进制数是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内存单元中。
开始
初始化BUF1,BUF2
内存单元
装载DS、ES段,
设置SI、DI
循环次数CX设
为BUF1长度
将DS:
SI中的
内容复制到
ES:
DI中
SI加一
DI加一
CX减一
N
CX=0?
Y
结束
MOVAL,'
#'
REPNZSCASB
JZL1
JNZL2
MOVAL,0
MOVAL,1
本程序使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
本程序要实现的功能是查找字符'
所以可将AL中的数据设置为'
。
若一次循环过程中ZF=1,即说明原字符串BUF1中也含有字符'
不同且CX不为0?
结束初始化BUF1内存单元循环次数CX设为字符串长度DI加一,CX减一装载ES段,设置DI比较ES:
DI中字符和'
NAL=0开始ZF=1?
NYYAL=1
(5
YYYSS22323&
g&
'
COUNTEQU$-BUF1
MOVBX,0
MOVCX,COUNT
L:
;
统计‘&
’个数
JZFOUND
FOUND:
发现一个‘&
’
INCCX
INCBX
LOOPL
本程序的目的是统计字符串中'
的个数。
使用的串操作指令为SCASB,其功能是把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
在循环中,若ZF=1,计数器BX便自增一,这样便实现了统计'
个数的目的。
初始化BUF1内存单元循环次数CX设为字符串长度DI加一,CX减一装载ES段,设置DI,BX清0比较ES:
NBX加一CX加一开始ZF=1?
NYYCX减一CX=0?
Y
(6
STRBUFDB'
COUNT1EQU$-STRBUF
FOUND$'
BUF2DB'
NOTFOUND$'
LEADI,STRBUF
找到了‘#’字符,输出FOUND。
MOVAH,9H
没找到‘#’字符,输出NOTFOUND。
本程序与(4很类似。
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
若一次循环过程中ZF=1,即说明原字符串STRBUF中也含有字符'
查找到则输出'
FOUND'
为了输出'
字符串,应提前将其放在内存中,并以$作为串的结束。
先将其有效地址放入DX中,再利用9号功能输出。
若未查找到则输出'
NOTFOUND'
五、实验结果与分析
BUF1与BUF2相同,AL返回0。
BUF1与BUF2不同,AL返回1。
共15个字符(含$
可看出BUF1已经复制到BUF2内存区域中。
(4
字符串不含‘#’,结果:
字符串含‘#’,结果:
AL=0
BX=000A共10个'
字符串含有‘#’,输出FOUND。
字符串不含有‘#’,输出NOTFOUND。
六、实验感想
本次实验为字符串操作,实验内容较多,并且在之前的课堂上没有涉及过。
经过本次实验,我掌握了串操作指令的寻址方式及使用方法,学会编写常用的字符串处理程序,了解汇编语言字符串处理基本流程。
主要使用的串操作指令如下:
MOVSB,其功能是把DS:
SI指向的存储单元中的数据装入ES:
DI指向的存储单元中,然后根据DF标志分别增减SI和DI。
SCASB把AL中的数据与ES:
DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。
CMPSB:
把DS:
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 汇编 实验 报告