当前位置:文档之家› 串操作指令

串操作指令

串操作指令
串操作指令就是用一条指令实现对一串字符或数据的操作。

8086的串操作指令的特点是:
◆通过加重复前缀来实现重复操作。

重复的次数取决于C X寄存器的内容(在字符串比较和字符串检索指令中还与Z F标志有关)。

◆可以对字节串进行操作,也可以对字串进行操作。

◆所有的串操作指令都用寄存器S I对源操作数进行间接寻址,默认段寄存器为D S;所有的串操作指令都用寄存器D I为目的操作
数进行间接寻址,默认段寄存器为E S。

串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令。

◆串操作时,地址指针的修改与方向标志D F有关,当D F=1时,S I和D I作自动减量修改,当D F=0时,S I和D I作自动增量修改。

串操作指令一共有5条:
◆字符串传送指令M O V S B/M O V S W
◆字符串比较指令C M P S B/C M P S W
◆字符串检索指令S C A S B/S C A S W
◆取字符串指令L O D S B/L O D S W
◆存字符串指令S T O S B/S T O S W
与上面串操作指令配合使用的重复前缀有:
◆重复R E P
◆相等则重复/为零则重复R E P E/R E P Z
◆不相等则重复/不为零则重复R E P N E/R E P N Z
在串操作指令的前面加上重复前缀,使C P U能重复执行该指令,这使处理长字符串比用软件循环处理快得多。

在执行有重复前缀的
串操作指令时,C X寄存器控制重复次数,每重复执行一次,C X内
容减1,C X减为0结束;此外,还可以按规定的条件(Z F=1或Z F =0)结束重复过程。

重复前缀对规定条件的检测,是在每次进入串操作以前进行的。

所以若初始化使操作次数C X为0,它将不会引起任何操作。

一、字符串传送指令M O V S B/M O V S W
字符串传送指令M O V S B/M O V S W将位于D S段的、由S I所指出的存储单元的内容传送到位于E S段、由D I所指的存储单元中,再修改S I和D I,从而指向下一个元素,M O V S B用于字节传送,
M O V S W用于字传送。

M O V S B或M O V S W指令前面通常加重复前缀R E P。

重复执行的次数取决于C X寄存器的值,每次执行先检查C X内容,当C X为0则退出,不为0则将C X内容减1,然后传送一次。

【例】我们来看下面的程序段。

M O V S I,1000H;源有效地址地址为1000H
M O V D I,2000H;目的有效地址地址为2000H
M O V C X,100;字符串长100个字节
C L D;方向标志清0,使指针按增量方向修改
R E P M O V S B;将源地址开始的100个字节传送到目的地址,每传送一次,地址指针加1,C X内容减1
二、字符串比较指令C M P S B/C M P S W
字符串比较指令C M P S B/C M P S W把在D S段中由S I所指的字节或者字和在E S段中由D I所指的字节或者字相比较(相减),影响标志位,并自动修改地址指针。

C M P S B/C M P S W指令的前面常常加重复前缀R E P E/R E P Z或
R E P N E/R E P N Z。

通过重复前缀的控制,利用C M P S B或者C M P S W,可以实现在两个字符串中寻找第一个不相等的元素或者第一个相等
的元素。

【例】下面这段程序:假定在缓冲区B U F1和缓冲区B U F2各存有一个字符串,长度为10个字符。

程序比较两个字符串,如果相等,将B L寄存器置为1,否则置为0。

L E A S I,B U F1;S I寄存器指向B U F1
L E A D I,B U F2;D I寄存器指向B U F2
C L D;清方向标志
M O V C X,0A H;计数器为10
M O V B L,1;先将B L置为1
R E P Z C M P S B;如比较结果相等,则重复执行,D I和S1分别加1,C X减1
J Z D O N E;如10个字节都相同,则B L=1
D E C B L;否则B L置为0
D O N E:;后续处理
使用C M P S B/C M P S W指令时,要注意:
前缀R E P N Z/R E P N E表示两个字符串的字节(或字)比较不等时,继续进行比较。

前缀R E P Z/R E P E表示两个字符串的字节(或字)比较相等时,继续比较。

每一种前缀都有两种形式,比如R E P N Z和R E P N E,它们的功能一样,使用时可以任意选择。

三、字符串检索指令S C A S B/S C A S W
使用字符串检索指令S C A S B或者S C A S W时,将A L中的字节或者A X中的字与位于E S段由D I寄存器所指的内存单元的字节或字相比较(相减,影响标志位)。

通过前缀,可以实现在D I所指的字符串中,寻找第一个与A L(或A X)的内容不同的字节(或字),或者寻找第一个与A L(或A X)的内容相同的字节(或字)。

【例】下面这段程序,要在T A B开始的100个字节串数据中查找’$’字符,如果找到则把B L寄存器置为1,没有找到则B L置为0。

M O V B L,1
M O V A L,’$’
L E A D I,T A B;字符串首地址送到D I
C L D;方向标志清0
M O V C X,100;字符串中共有100个字节
R E P N Z S C A S B;比较结果不等,则继续往下比
J Z D O N E;找到和A L内容相同的字符则B L=1,转后续处理
D E C B L;A L中的值和字符串中的所有字节都不等,
置B L=0
D O N E:;后续处理
使用S C A S B/S C A S W指令时,有几点要注意:
1、目的字符串默认在E S段中,字符串首址的偏移量必须用D I 指出。

2、上面例子中,退出R E P N Z S C A S B串操作循环的情况有两种:一种情况是检索到字符串中某个字节与A L中的字节相等,从而退出;另一种情况是字符串中没有任何一个字节和A L中的字节相等,但已经检索完毕,从而退出。

随后,可以通过对Z F的检测来判断当前是处于哪种情况。

如果是前一种情况,则Z F=l;如果是后一种情况,则Z F=0。

要注意的是,Z F并不受C X在串操作过程中不断减1的影响。

四、取字符串指令L O D S B/L O D S W
取字符串指令L O D S B/L O D S W将位于D S段由S I所指的存储单元的内容取到A L或A X中。

用L O D S B时,取的是字节,取完后,地址自动加1或减l;用L O D S W时取的是字,取完后地址自动加2或减2。

因为使用L O D S B/l O D S W指令时,取来的字节或字放在A L或A X中,所以L O D S B/L O D S W指令前不能加前缀,否则,A L或A X 中的内容会被后一次取到的内容所覆盖,最后只能得到字符串的最后1个字节或字。

实际使用时,L O D S B/L O D S W指令一般用在循环程序中。

五、存字符串指令S T O S B/S T O S W
存字符串指令S T O S B/S T O S W把A L或A X中的数存到E S段中由D I寄存器所指的内存单元,并且自动修改地址指针。

加上前缀R E P 以后,用S T O S B或S T O S W指令可以使一个内存区域中填满相同的数。

【例】下面的程序段使0400H开始的256个单元清0。

C L D;清除方向标志
L E A D I,[0400H];将目的地址0400H送D I
M O V C X,0080H;每次传送一个字,共有128个字
X O R A X,A X;A X清0
R E P S T O S W;将目的区的256个字节清0。

相关主题