北京理工大学汇编实验报告3Word下载.docx

上传人:b****4 文档编号:17866227 上传时间:2022-12-11 格式:DOCX 页数:14 大小:44.19KB
下载 相关 举报
北京理工大学汇编实验报告3Word下载.docx_第1页
第1页 / 共14页
北京理工大学汇编实验报告3Word下载.docx_第2页
第2页 / 共14页
北京理工大学汇编实验报告3Word下载.docx_第3页
第3页 / 共14页
北京理工大学汇编实验报告3Word下载.docx_第4页
第4页 / 共14页
北京理工大学汇编实验报告3Word下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

北京理工大学汇编实验报告3Word下载.docx

《北京理工大学汇编实验报告3Word下载.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验报告3Word下载.docx(14页珍藏版)》请在冰豆网上搜索。

北京理工大学汇编实验报告3Word下载.docx

惠普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中。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1