北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx
《北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编语言实验报告实验三字符串操作实验Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
把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等等,深入地
了解了它们的循环条件后,会给编程带来很大便利。