📄 page106.html
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第5章 子过程和串处理</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page105.html">上一页</a> <a href="page107.html">下一页</a> <a href="page116.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td>
</tr>
<!页眉行>
<tr height=60 valign="bottom">
<td></td><td>-106-</td><td></td> <!页码>
<td colspan=6>PC机汇编语言实战精解</td><td colspan=4></td><td colspan=6 align="right"><img src="icons/flag.gif"></td> <!书名>
<td></td><td></td><td></td> <!右侧空白>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
有数据都扫一遍。而我们所需要的恰好是扫描整个串,这又该如何应用SCAS指令呢?<br>
幸好SCAS指令可以配合一个前缀,这个前缀就是:
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=3 align="center"><img src="icons/note.gif"></td>
<td colspan=15>
助记符:REP(Repeat)<br>
用 途:作为前缀使后面的串指令重复执行,重复次数在CX中设定。<br>
格 式:REP 串处理指令<br>
执 行:判断CX,若CX不为0,则CX寄存器减1,执行后面的指令,重复这三个步骤直至CX=0<br>
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
在实际应用中这个前缀往往采用这样两种形式:
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2><hr></td>
<td colspan=7 align="center"><font size=5>REPE/REPZ-REPNE/REPNZ<font></td>
<td colspan=9><hr></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18><font face="楷体_GB2312">
指令中的"E"和"Z"与前面讨论的条件转移指令"JE/JZ"和"JNE/JNZ"中的"E"、"Z"含义相同。REPE的意思就是"Repeat While equal"--相等则重复,NE自然是"Not Equal"了。在前面的程序中我们使用了"REPNZ"作为前缀,因为我们要寻找一个与AL寄存器相等的数据,自然要在"不相等"的情况下重复SCASB指令,而一旦找到相等的数据,即使CX不为0,REP也会停止。这样做可以提高程序的效率,避免无意义的搜索。如果我们要在一串相同的数据中寻找一个与众不同者,那么自然要用"REPE"或"REPZ"作前缀了。
</font></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18><hr></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
由于SCAS指令的实际动作是将串中的数据与累加器进行比较,"找到"意味着ZF=1,"找不到"对应ZF=0,因此我们可以用"JZ/JNZ"指令来检测扫描结果。注意在计算"$"的位置时我们让DI寄存器多减了1,想一想这是为什么。<br>
至此我们已经可以在一个串中寻找到一个字节或一个字的数据,下面我们来讨论一个更复杂的问题--如何在一个字符串中找到一个"子字符串"?<br>
按照前面的习惯,我们先看看一般的解决办法:<br>
SCHSTR.ASM
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>
data<br>
<br>
string<br>
substrg<br>
ascii<br>
data<br>
<br>
code<br>
<br>
main<br>
<br>
<br>
<br>
next_str:<br>
<br>
<br>
</td>
<td colspan=2>
segment<br>
assume<br>
db'The sa<br>
db'sunshi<br>
db'012345<br>
ends<br>
<br>
segment<br>
assume<br>
proc<br>
mov<br>
mov<br>
mov<br>
<br>
mov<br>
lodsb
</td>
<td colspan=6>
<br>
ds:data<br>
me sunshine is presented to<br>
ne',0<br>
6789ABCDEF'<br>
<br>
<br>
<br>
cs:code<br>
far<br>
ax,data<br>
ds,ax<br>
di,offset string<br>
<br>
si,offset substrg<br>
<br>
</td>
<td colspan=8>
<br>
<br>
all those who love sunshine',0<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
;初始化DS寄存器指向数据段<br>
<br>
;DI寄存器指向字符串STRING<br>
<br>
;SI寄存器指向待查字符串<br>
;取得待查字符串的第一个字母
</td>
<td></td><td></td> <!右边距>
</tr>
</font>
<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page105.html">上一页</a> <a href="page107.html">下一页</a> <a href="page116.html">下一章</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -