串操作指令共五条,它们分别是:串传送指令MOVS、串比较指令CMPS、串搜索指令SCAS、取串指令LODS、存串指令STOS。这些串操作指令使字符串的操作变得简单、方便,使程序设计工作也简单化。串操作指令隐含使用相同的寄存器、标志位和符号,并且系统规定:源串一定要在当前数据段中,目的串只允许在当前附加数据段中,用寄存器SI寻址源操作数,用寄存器DI寻址目的操作数。所有的串操作指令均以寄存器间接寻址方式访问源串或目的串的各元素,并自动修改地址指针SI和DI的内容,修改方向由方向标志DF决定。若DF=0,则每次操作后,SI、DI自动增量(字节操作加1,字操作加2);若DF=1,则每次操作后,SI、DI自动减量(字节操作减1,字操作减2),使指针指向下一个元素。
串操作指令还可以加上重复前缀,使字符串操作指令可以重复多次执行。重复次数由CX确定,重复执行直到不满足重复条件为止。可使用的重复前缀及其功能见表3-2。
表3-2 重复前缀及其功能
说明:表中SOPR1是指串操作指令MOVS、STOS、LODS,即这三条指令可以加REP前缀。SOPR2是指串操作指令CMPS、SCAS,即这两条指令可以加重复前缀REPE/REPZ、REPNE/REPNZ。另外,若CX的初值为0,则不会引起串操作。
1.串传送指令
指令格式:
①MOVS OPD,OPS
②MOVSB—字节串传送
③MOVSW—字串传送
功能:
①(DS:[SI])→ES:[DI]。
②当DF=0时,SI和DI自动增量1(字节操作)或2(字操作);当DF=1时,SI和DI自动减量1(字节操作)或2(字操作)。即以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中,并自动修改指针,使之指向下一个字节(或字)存储单元。
指令中,OPS、OPD分别为源串和目的串的符号首址。第二、三种格式由于已用字符“B”、“W”指出了串的类型,因此不用带操作数,通常使用这两种格式。
使用串操作指令应注意以下两点:
①由于目的串一定要放在当前附加数据段中,因此程序中一定要定义附加数据段,最简单而又不易出错的方法是使当前数据段与当前附加数据段重合。
②在使用串操作指令之前一定要设置方向标志DF。
2.串比较指令
指令格式:
①CMPS OPD,OPS
②CMPSB—字节串比较
③CMPSW—字串比较
功能:
①(DS:[SI])-(ES:[DI]),即将源串中的一个字节(或字)存储单元中的数据与目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志位,但源串和目的串的内容保持不变。
②自动修改指针,使之指向下一个字节(或字)存储单元。当DF=0时,SI和DI自动增量1(字节操作)或2(字操作);当DF=1时,SI和DI自动减量1(字节操作)或2(字操作)。
说明:串比较指令与比较指令CMP有一个重要区别:串比较指令操作时是源操作数减目的操作数,比较指令是目的操作数减源操作数。
指令执行后,若标志位ZF=1,表示被比较的字节(或字)相等,否则不相等。
3.串搜索指令
指令格式:
①SCAS OPD
②SCASB—字节串搜索
③SCASW—字串搜索
功能:
①字节操作:(AL)-(ES:[DI]);字操作:(AX)-(ES:[DI])。根据相减的结果设置标志位,但AL或AX和目的串的内容保持不变。
②自动修改指针,使之指向下一个字节(或字)存储单元。当DF=0时,SI和DI自动增量1(字节操作)或2(字操作);当DF=1时,SI和DI自动减量1(字节操作)或2(字操作)。(www.xing528.com)
说明:该指令主要用于在一串数据中搜索某个值,该值预先要置入AL或AX。该串数据是在附加数据段中,所以必须要定义附加数据段。
指令执行后,若标志位ZF=1,表示被比较的字节(或字)与AL(或AX)中的数据相等,否则不相等。
4.取串指令
指令格式:
①LODS OPS
②LODSB—从字节串中取数
③LODSW—从字串中取数
功能:
①字节操作:(DS:[SI])→AL;字操作:(DS:[SI])→AX。即将源串中的一个字节(或字)存储单元中的数据送AL或AX。
②自动修改指针,使之指向下一个字节(或字)存储单元。当DF=0时,SI和DI自动增量1(字节操作)或2(字操作);当DF=1时,SI和DI自动减量1(字节操作)或2(字操作)。
说明:该指令操作是在源串中取数,所以必须定义数据段。
5.存串指令
指令格式:
①STOS OPD
②STOSB—往字节串中存数
③STOSW—往字串中存数
功能:
①字节操作:AL→(ES:[DI]);字操作:AX→(ES:[DI])。即将AL或AX的内容送目的串中的一个字节(或字)存储单元中。
②自动修改指针,使之指向下一个字节(或字)存储单元。当DF=0时,SI和DI自动增量1(字节操作)或2(字操作);当DF=1时,SI和DI自动减量1(字节操作)或2(字操作)。
说明:该指令操作是往目的串中存数,所以必须定义附加数据段。
例3-32 将SBUFFER缓冲区中的数据字节传送到DBUFFER缓冲区中,寄存器CX中保存着要传送数据字节的个数。程序片段如下:
方法一:一般指令
方法二:利用MOVSB指令
方法三:利用加重复前缀的MOVSB指令
上述三种方法功能完全一样,显然最后一种方法程序最简洁。
例3-33 比较两个字符串,若有一个相应字节相同,则停止比较,否则继续比较。
方法一:一般指令
方法二:利用带重复前缀的串比较指令
显然方法二的程序要简洁。需要说明的是,REPNZ CMPSB指令是在(CX)≠0和ZF=0两个条件同时满足的情况下才重复执行,只要一个条件不满足就会跳出循环。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。