串操作指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串操作指令
串操作指令就是用一条指令实现对一串字符或数据的操作。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;比较结果不等,则继续往下比