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

上传人:b****2 文档编号:797280 上传时间:2023-04-30 格式:DOCX 页数:22 大小:173.72KB
下载 相关 举报
北京理工大学汇编实验报告3.docx_第1页
第1页 / 共22页
北京理工大学汇编实验报告3.docx_第2页
第2页 / 共22页
北京理工大学汇编实验报告3.docx_第3页
第3页 / 共22页
北京理工大学汇编实验报告3.docx_第4页
第4页 / 共22页
北京理工大学汇编实验报告3.docx_第5页
第5页 / 共22页
北京理工大学汇编实验报告3.docx_第6页
第6页 / 共22页
北京理工大学汇编实验报告3.docx_第7页
第7页 / 共22页
北京理工大学汇编实验报告3.docx_第8页
第8页 / 共22页
北京理工大学汇编实验报告3.docx_第9页
第9页 / 共22页
北京理工大学汇编实验报告3.docx_第10页
第10页 / 共22页
北京理工大学汇编实验报告3.docx_第11页
第11页 / 共22页
北京理工大学汇编实验报告3.docx_第12页
第12页 / 共22页
北京理工大学汇编实验报告3.docx_第13页
第13页 / 共22页
北京理工大学汇编实验报告3.docx_第14页
第14页 / 共22页
北京理工大学汇编实验报告3.docx_第15页
第15页 / 共22页
北京理工大学汇编实验报告3.docx_第16页
第16页 / 共22页
北京理工大学汇编实验报告3.docx_第17页
第17页 / 共22页
北京理工大学汇编实验报告3.docx_第18页
第18页 / 共22页
北京理工大学汇编实验报告3.docx_第19页
第19页 / 共22页
北京理工大学汇编实验报告3.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

北京理工大学汇编实验报告3

北京理工大学汇编实验报告3

本科实验报告

实验名称:

实验三字符串操作实验

课程名称:

课程设计Ⅰ(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长度

 

 

 

 

结束

(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中。

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2