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

上传人:b****4 文档编号:16897744 上传时间:2022-11-27 格式:DOCX 页数:15 大小:120.67KB
下载 相关 举报
北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx_第1页
第1页 / 共15页
北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx_第2页
第2页 / 共15页
北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx_第3页
第3页 / 共15页
北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx_第4页
第4页 / 共15页
北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

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

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

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

把AL或AX中的数据与ES:

DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;

cmpsbcmpsw把DS:

SI指向的存储单元中的数据与ES:

DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增

减SI和DI;

rep:

重复其后的串操作指令。

重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。

主要用在MOVS和STOS前。

一般不用在LODS前。

上述指令涉及的寄存器:

段寄存器DS和ES变址寄存器SI和DI、累加器AX计数器CX涉及的标志位:

DFAF、

CFOFPFSF、ZF。

四、实验内容

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

提示:

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

⑴实验框图

(II)实验代码

DATASSEGMENT

BUF1DB'

ABCDEFGH'

COUNT1EQU$-BUF1;

利用EQ指令,自动获取字符串

长度

DATASENDS

EXTRASEGMENT;

定义附加段,即ES段

BUF2DB'

C0UNT2EQU$-BUF2;

功能同BUF1

EXTRAENDS

C0DES5EGMENT

ASSUMCS:

CODES,DS:

DATAS,ES:

EXTRA

START

MOVXQATAS

MO\DS,AX

MOVX,EXTRA

MO\ES,AX

LEASI,BUF1;

把源操作串的地址放在SI中

LEADI,BUF2;

把目的操作串的地址放在DI中

MOVCX,COUNT1

CMPCX,COUNT2;

先比较BUF1BUF2勺长度

JNZEXIT1;

长度不一样,字符串不同,跳

转至UEXIT1

CLD;

设置字符串操作方向

EXIT1

MOSLQ;

若全部相同,则字符串相同,返

回AL=0

JMPEXIT2

EXIT1:

MO\AL,1;

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

EXIT2:

MO\AH,4CH

INT21H

CODESENDS

END6TART

(III)实验结果

序号

BUF1

BUF2

AL

1

ABCDEFG

HABCDEFG

H0

2

ABC

ABCDE

3

ABD

二6060CX=6OO0DX=60GGSP二6006HP二6006£

1二OOGflDI=0OOG

B5W71TES=e?

71SS=e?

6FCS=e772IP=0GEBMUUFElPLZRNAPEMCG77z;

oeeacdziimtzi

CX=0Q60DX=00G0SP=GOG©

BP=GG00SI=0O0G>

DI=00O©

SS=G76FCS=0?

7ZIF=6QE8MUUPElPLMSMAFOMCINTZl

鱼亘眇ex二0000Dx=tw0t)sr=ye0©

bp二0000si=0003in二0003

5^5770ES=6771SS=flf?

6FCS=07?

2IP=G0G8HllUPElNGHZACPECY772:

0026CDZ1IITTZ1

(IV)实验结果分析

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

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

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

2)编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$'

作为结束标志,计算该字符串的长度并输出。

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

(I)实验框图

BUFDB'

TBE123000000$'

EXTRASEGMENT

CHARDB'

$'

;

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

CODES5EGMENT

LEASI,BUF;

获取BUF的地址

L:

MO\AL,[SI]

SCASBCHAR

JNZEXIT1

JZEXIT2

INCSI;

不是‘$'

计数器加1,同时字符串后移一位

JMPL

DECSI;

SI多加了一个1

MOVX,SI

MO\BL,10

DIVBL;

考虑SI是两位数的情况

MO\DX,AX

ADDDX,3030H;

把数字转化为ASCII码

MO\AH,02H

INT21H;

打印低位

MO\DL,DH

打印高位

ENDSTART

字符串

屏幕输出结果

'

123456$'

06

0123456789$'

10

PressdnykeytogqM

Pressanukeutocontinue

序号1:

L循环了6次,查找到‘$'

故SI等于6,直接用DOS勺2号功能打印出字符2,注意DL里的数字2转化为“字符2的ASCII码”加上30H即可;

序号2:

循环十次,主要是逻辑上的两位数,要分离处理,因为2号功能只能打印一个字符;

考虑除以10,得到商作为十位,余数作为个位。

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

3)编写程序,将内存中BUF1某一区域的数据

传送到另一区域BUF2中,要求用字符串处方

法。

 

TBE123000000'

COUNTEQU($-BUF1)

CODESSEGMENT

LEASI,BUF1

LEADI,BUF2

MOVCX,COUNT

;

设置CX的值

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

REPMOVSB;

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

(III)实验结果

字符串BUF1

结果

见下图

-dds:

G

常?

0:

0060珂舵箔刃龙33旳了43®

旳抑3®

盹000660TBE1Z3OO0OO6…

G?

71:

O00O5442轲313Z333030-3030393©

Z000GOC©

TBE1Z300G00G■…

(IV)实验分析

本题难度较小,只要一个重复前缀REP再用

MOVS就可以实现“搬移”。

4)编写程序,在已知字符串中搜索特定字符’#'

,若找到则AL返回0,找不到AL返回1,要求用字符串处理方法。

TBE123000000'

CHARDB'

#'

DATAS

LEADI,BUF1

MO\AL,'

‘#'

放在AL中,准备使用SCASB旨令

MOVCX,COUNT;

设置循环次数

设置DF=0,正向操作

REPNESCASB;

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

JZFOUND;

若ZF=0,说明找到‘#'

,赋值AL=0

MO\AL,1;

否则,没找到‘#'

赋值AL=1

JMPEXIT

FOUND:

MO\AL,0

EXIT:

TBE123000000

I

TBE12300#'

BUF为'

的结果:

^O77Zlue00l30Id

g^ceT>

x=0O0ocx=0t»

odx=o9O0sp-oeoebf-qooosi-oooe»

i=o0ocBS^077OE3=0770SS=Q?

6FCS=f>

?

7ZIP-001DNUUPElNGMZMFECYe77Z;

e01DCDZ1IMTZ1

的结果:

-g=Q?

2:

GeOG0013

hX=4C06^6X=0e0GCX二GOO©

DX二O000SF=00GG>

BF=GOG0S1=0O0ODI=0009DS=0770ES=G)?

GSS=G76FCS=G77ZIP=©

01DHUUPElPLZKMAPEHCQ?

7Z:

0O1DCD21IHTZ1

本次实验较为简单,设置好CX和DF后,将'

放入AL,利用重复前缀REPN以及字符串比较指令SCASB进行逐个比较,一旦发现ZF=O,跳转到FOUND寸AL进行赋0;

否则,比较结束后,没找到’#'

,AL=1o

5)编写程序,统计一串字符串中字符"

&

"

出现的次数,要求用字符串处理方法。

(I)实验框图

BUF1db'

adc&

countequ$-string

STACKSSEGMENT

STACKSENDS

DATAS,SS:

STACKS

leasi,BUF1

movcx,count;

设置循环次数

Cid;

DF=0,正向操作

L1:

lodsb

cmpal,&

jnzL2;

不是&

就继续循环

incbx;

是&

,BX就加1L2:

loopL1

‘&

个数(BX

4

159*%¥

@#'

kg=0f?

7110000001a

AX=4Cg(QX=00Q£

>

CX=90O0DX^OSOOSF^OOGOHF二G060SI=000?

Ll^OOGOUS=0?

TOES^?

6CSS=076FCS=G7?

1IF=G01hMUUPElPLNZNAPOMC

lflX-4C23<

S<

-OOOQ1>

CX-060QDX0OO0SP-0000BP-O0G0SI-0GO9DI-00GO|DS=0?

OES=O760SS=GT?

6FCS=G771IF=O01ANUUPElMGNZACPOCY10771:

00"

CDZ1INT21

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

找到一个’&

就让BX加1,否则跳到LOOPL1继续循环。

6编写程序,设有一字符串已存放在STRBUF为

首址的数据区中,编一程序找出其中的‘#'

字符,如果字符串中不存在‘#'

字符则应该输出

“Notfound”。

MOV)S,AX

movbx,0

leasi,strbuf

获取字符串地址

movcx,count

Cid

设置DF=0

cmpal,'

jzL2

movah,9h;

未找到'

,打印'

Notfound

leadx,string1

int21h

L2:

movah,9h

leadx,string2

int21h;

找到’#'

,打印’Found'

ABCD&

Notfound

AB#&

Found

(IV)实验分析

本题与与第(4)题思路一样,只是最后结果的处理不一样,题目要求没找

到‘#'

输出’Notfound'

,需要调用DOS勺9号功能来打印字符串;

在此基础上,没找到时,输出’Found'

更加直观。

五、实验心得

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

通过实验,我对字符串操作有了更清晰的思路;

在此将字符串操作的主要流程归纳如下:

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

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

(3)数据串长度放入CX

(4)建立方向标志;

(CLD指令使DF=0STD指令使DF=1)

(5)执行串操作。

在第五步中,会用到重复前缀,REP\REPZ\REPN等等,深入地

了解了它们的循环条件后,会给编程带来很大便利。

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

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

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

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