北京理工大学汇编语言实验报告实验三字符串操作实验.docx

上传人:b****2 文档编号:2908718 上传时间:2023-05-05 格式:DOCX 页数:17 大小:178.40KB
下载 相关 举报
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第1页
第1页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第2页
第2页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第3页
第3页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第4页
第4页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第5页
第5页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第6页
第6页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第7页
第7页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第8页
第8页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第9页
第9页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第10页
第10页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第11页
第11页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第12页
第12页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第13页
第13页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第14页
第14页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第15页
第15页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第16页
第16页 / 共17页
北京理工大学汇编语言实验报告实验三字符串操作实验.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

北京理工大学汇编语言实验报告实验三字符串操作实验.docx

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

北京理工大学汇编语言实验报告实验三字符串操作实验.docx

北京理工大学汇编语言实验报告实验三字符串操作实验

北京理工大学汇编语言实验报告实验三字符串操作实验

实验三字符串操作实验

 

一、实验目的

1)熟悉串操作指令的功能与应用;

2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;

3)了解汇编语言字符串处理基本流程;

二、实验软硬件环境

1)硬件环境:

惠普64位一体化计算机及局域网;

2)软件环境:

windows 8,红蜘蛛管理系统,MASM for Windows。

三、实验相关知识

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。

4、实验内容

1)编写程序,比较两个字符串BUF1和BUF所含的字符是否相同,相同则AL返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。

提示:

输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。

(I)实验框图

(II)实验代码

DATASSEGMENT

BUF1DB'ABCDEFGH'

COUNT1EQU$-BUF1;利用EQU指令,自动获取字符串长度

DATASENDS

EXTRASEGMENT;定义附加段,即ES段

BUF2DB'ABCDEFGH'

COUNT2EQU$-BUF2;功能同BUF1

EXTRAENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,ES:

EXTRA

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,EXTRA

MOVES,AX

LEASI,BUF1;把源操作串的地址放在SI中

LEADI,BUF2;把目的操作串的地址放在DI中

MOVCX,COUNT1

CMPCX,COUNT2;先比较BUF1、BUF2的长度

JNZEXIT1;长度不一样,字符串不同,跳转到EXIT1

CLD;设置字符串操作方向

REPECMPSB;逐个字符比较

JNZEXIT1;一旦有不同的字符,跳转到EXIT1

MOVAL,0;若全部相同,则字符串相同,返回AL=0

JMPEXIT2

EXIT1:

MOVAL,1;当字符串不同时,返回AL=1

EXIT2:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(III)实验结果

序号

BUF1

BUF2

AL

1

ABCDEFGH

ABCDEFGH

0

2

ABC

ABCDE

1

3

ABC

ABD

1

(IV)实验结果分析

序号1中,程序先经过比较字符串长度,相等后再逐一判断每个字符,确定都相等后,返回AL=0;

序号2中,比较字符串长度已经发现不相等,所以返回AL=1;

序号3中,比较了字符串长度,发现相等,进一步比较字符,循环到最后一个字符时,不相等,所以AL=1.

 

2)编写程序,设有一字符串存放在以 BUF 为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。

提示:

从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。

(I)实验框图

(II)实验代码

DATASSEGMENT

BUFDB'TBE123000000$'

DATASENDS

EXTRASEGMENT

CHARDB'$';ES段设置待比较的字符‘$’

EXTRAENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,ES:

EXTRA

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,EXTRA

MOVES,AX

LEASI,BUF;获取BUF的地址

L:

MOVAL,[SI]

SCASBCHAR

JNZEXIT1

JZEXIT2

EXIT1:

INCSI;不是‘$’,计数器加1,同时字符串后移一位

JMPL

EXIT2:

DECSI;SI多加了一个1

MOVAX,SI

MOVBL,10

DIVBL;考虑SI是两位数的情况

MOVDX,AX

ADDDX,3030H;把数字转化为ASCII码

MOVAH,02H

INT21H;打印低位

MOVDL,DH

MOVAH,02H

INT21H;打印高位

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(III)实验结果

序号

字符串

屏幕输出结果

1

'123456$'

06

2

'0123456789$'

10

(IV)实验结果分析

序号1:

L循环了6次,查找到‘$’,故SI等于6,直接用DOS的2号功能打印出字符2,注意DL里的数字2转化为“字符2的ASCII码”,加上30H即可;

序号2:

循环十次,主要是逻辑上的两位数,要分离处理,因为2号功能只能打印一个字符;考虑除以10,得到商作为十位,余数作为个位。

此时还是二进制,加上3030H,在打印即可。

3)编写程序,将内存中 BUF1 某一区域的数据传送到另一区域 BUF2中,要求用字符串处方

法。

(I)实验框图

(II)实验代码

DATASSEGMENT

BUF1DB'TBE123000000'

COUNTEQU($-BUF1)

DATASENDS

EXTRASEGMENT

BUF2DBCOUNTDUP(?

);定义了BUF1长度COUNT的字符串

EXTRAENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,ES:

EXTRA

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,EXTRA

MOVES,AX

LEASI,BUF1

LEADI,BUF2

MOVCX,COUNT;设置CX的值

CLD;设置DF=0,[SI]增加的方向进行串操作

REPMOVSB;进行数据段DS到附加段ES的搬移

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(III)实验结果

字符串BUF1

结果

'TBE123000000'

见下图

(IV)实验分析

本题难度较小,只要一个重复前缀REP,再用MOVSB就可以实现“搬移”。

4)编写程序,在已知字符串中搜索特定字符’#’,若找到则AL返回0,找不到AL返回1,要求用字符串处理方法。

(I)实验框图

(II)实验代码

DATASSEGMENT

BUF1DB'TBE123000000'

COUNTEQU($-BUF1)

DATASENDS

EXTRASEGMENT

CHARDB'#'

EXTRAENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,ES:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

MOVES,AX

LEADI,BUF1

MOVAL,'#';‘#’放在AL中,准备使用SCASB指令

MOVCX,COUNT;设置循环次数

CLD;设置DF=0,正向操作

REPNESCASB;不相等时继续循环,相等时顺序执行下面指令

JZFOUND;若ZF=0,说明找到‘#’,赋值AL=0

MOVAL,1;否则,没找到‘#’,赋值AL=1

JMPEXIT

FOUND:

MOVAL,0

EXIT:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(III)实验结果

序号

字符串

AL

1

'TBE123000000'

1

2

'TBE12300#'

0

BUF为'TBE123000000'的结果:

BUF为'TBE12300#'的结果:

(IV)实验分析

本次实验较为简单,设置好CX和DF后,将‘#’放入AL,利用重复前缀REPNE以及字符串比较指令SCASB,进行逐个比较,一旦发现ZF=0,跳转到FOUND,对AL进行赋0;否则,比较结束后,没找到‘#’,AL=1。

5)编写程序,统计一串字符串中字符"&"出现的次数,要求用字符串处理方法。

(I)实验框图

(II)实验代码

DATASSEGMENT

BUF1db'&&&adc&'

countequ$-string

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

movbx,0;将计数器BX清零

leasi,BUF1

movcx,count;设置循环次数

Cld;DF=0,正向操作

L1:

lodsb

cmpal,'&'

jnzL2;不是'&'就继续循环

incbx;是'&',BX就加1

L2:

loopL1

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(III)实验结果

序号

字符串

‘&’个数(BX)

1

'&&&adc&'

4

2

'159*%¥@#'

0

(IV)实验分析

将CX和DF设置好以后,就可以从第一个字符开始比较,这里用到CMP,而不是SCASB,因为前者可以用于比较并计数,后者只能扫描字符。

找到一个’&’,就让BX加1,否则跳到LOOPL1,继续循环。

 

6)编写程序,设有一字符串已存放在 STRBUF 为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Not found”。

(I)实验框图

 

(II)实验代码

DATASSEGMENT

strbufdb'&&AB#&'

countequ$-strbuf

string1db'Notfound$'

string2db'Found$';可能会输出的字符串

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

movbx,0

leasi,strbuf;获取字符串地址

movcx,count;设置循环次数

Cld;设置DF=0

L1:

lodsb

cmpal,'#'

jzL2

loopL1

movah,9h;未找到’#’,打印’Notfound’

leadx,string1

int21h

L2:

movah,9h

leadx,string2

int21h;找到’#’,打印’Found’

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

(III)实验结果

序号

字符串

结果

1

'&&ABCD&'

Notfound

2

'&&AB#&'

Found

(IV)实验分析

本题与与第(4)题思路一样,只是最后结果的处理不一样,题目要求没找到‘#’,输出’Notfound’,需要调用DOS的9号功能来打印字符串;在此基础上,没找到时,输出’Found’,更加直观。

5、实验心得

本次实验主要是要求熟练掌握字符串操作,在此基础上,还有一些打印输出的训练,比如打印单个字符、字符串。

通过实验,我对字符串操作有了更清晰的思路;在此将字符串操作的主要流程归纳如下:

(1)数据段中的源串首地址放入SI;

(2)附加段中的目的串首地址放入DI;

(3)数据串长度放入CX;

(4)建立方向标志;(CLD指令使DF=0,STD指令使DF=1)

(5)执行串操作。

在第五步中,会用到重复前缀,REP\REPZ\REPNZ等等,深入地了解了它们的循环条件后,会给编程带来很大便利。

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

当前位置:首页 > 初中教育 > 语文

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

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