《汇编语言程序设计第十章串操作指令与程序设计》由会员分享,可在线阅读,更多相关《汇编语言程序设计第十章串操作指令与程序设计(39页珍藏版)》请在金锄头文库上搜索。
1、-朱耀庭汇编语言程序设计汇编语言程序设计-朱耀庭朱耀庭 第第10章章串操作指令与程序设计串操作指令与程序设计v在在程程序序设设计计过过程程中中,往往往往需需要要对对成成片片连连续续单单元元的的字字节节或或字字数数据据进进行行移移动动和和比比较较,以以及及从从中中搜搜索索特特定定的的字字节节或或字字等等操操作。作。v80X86提供了满足这一要求的串操作指令提供了满足这一要求的串操作指令v80X86汇汇编编语语言言中中称称存存放放在在内内存存储储器器中中的的成成片片连连续续存存储储的的数数据据为为串串,如如果果数数据据类类型型是是字字节节则则称称作作字字节节字字符符串串,如如果果数数据据类类型型是
2、是字字则则称称作作字字字字符符串串,在在不不引引起起混混淆淆的的情情况况下下统统称为字符串。称为字符串。v本本章章将将介介绍绍有有关关串串的的定定义义、串串操操作作指指令令,以以及及串串操操作作的的应应用等内容。用等内容。南开大学南开大学朱耀庭朱耀庭第第10章章串操作指令与程序设计串操作指令与程序设计10.3串操作指令的重复前串操作指令的重复前缀10.2字符串操作指令字符串操作指令10.1字符串操作字符串操作综述述南开大学南开大学朱耀庭朱耀庭10.1字符串操作字符串操作综述述串的定义串的定义1串操作指令概述串操作指令概述南开大学南开大学朱耀庭朱耀庭1.串的定义串的定义v字符串是指存储器中连续存
3、储的字节或字数据序列字符串是指存储器中连续存储的字节或字数据序列v例如:例如:S1DBHELLOWORLD!S2DB5,6,7,8S3DW9,5,2,7S4DB100DUP(0)S5DW50DUP(?)v以上变量定义的都是串以上变量定义的都是串v其中其中S1、S2和和S4是用是用DB定义的字节串,定义的字节串,S3和和S5是用是用DW定义的字串。定义的字串。南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v字符串操作有字符串操作有5种基本的操作指令,称为基本字符串指令。种基本的操作指令,称为基本字符串指令。v字符串指令是对字节串或字串进行操作,每次处理一个元字符串指令是对字节串或字
4、串进行操作,每次处理一个元素素(字节或字字节或字)。v基本字符串指令包括:基本字符串指令包括:MOVS传送字节或字的字符串指令传送字节或字的字符串指令CMPS比较字节或字的字符串指令比较字节或字的字符串指令SCAS搜索字节或字的字符串指令搜索字节或字的字符串指令LODS取字节或字的字符串指令取字节或字的字符串指令STOS存字节或字的字符串指令存字节或字的字符串指令南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v利用这些指令最多可以处理利用这些指令最多可以处理64K字节长的字符串。字节长的字符串。v字符串指令可以对字符串的某个元素字符串指令可以对字符串的某个元素(字节或字字节或字)
5、进行传送、进行传送、比较、搜索,以及将字符串元素取至累加器比较、搜索,以及将字符串元素取至累加器(AL、AX或或EAX)中和将累加器中和将累加器(AL、AX或或EAX)中的值存入字符串中的值存入字符串(存存储器字节、字或双字储器字节、字或双字)。v字符串指令可以有一个源操作数字符串指令可以有一个源操作数(源串源串)、一个目的操作数、一个目的操作数(目标串目标串)或二者均有。或二者均有。v源串是指由源串是指由DS:SI指向的字节或字符串指向的字节或字符串v目标串是指由目标串是指由ES:DI指向的字节或字符串指向的字节或字符串南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v源串是在成
6、片移动时的数据源源串是在成片移动时的数据源v目目标标串串是是在在成成片片移移动动时时的的目目标标,即即将将源源串串中中的的字字节节或或字字逐逐个移动到目标串对应的位置。个移动到目标串对应的位置。v串比较是指源串与目标串的逐个元素的比较。串比较是指源串与目标串的逐个元素的比较。v串串搜搜索索是是指指在在目目标标串串中中搜搜索索与与指指定定的的字字节节或或字字是是否否有有匹匹配配的的字字节节或或字字,被被搜搜索索的的字字节节要要求求存存放放在在AL中中,而而被被搜搜索索的的字则要求存放在字则要求存放在AX中。中。南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v无无论论是是串串传传送送
7、指指令令MOVS,串串比比较较指指令令CMPS,还还是是串串搜搜索索指指令令SCANS,每每执执行行一一次次串串操操作作指指令令,其其源源串串指指针针SI、目标串指针目标串指针DI都自动修改指向下一个操作的字节或字。都自动修改指向下一个操作的字节或字。v如如果果是是字字节节操操作作,其其增增量量为为正正负负1;如如果果是是字字操操作作则则增增量量为为正正负负2。增增量量为为正正,表表示示下下一一次次操操作作指指向向高高地地址址,称称作作正正向向串串操操作作,由由标标志志寄寄存存器器的的DF=0决决定定,可可以以通通过过指指令令CLD置置DF=0;增增量量为为负负,表表示示下下一一次次操操作作指
8、指向向低低地地址址,称称作作负负向向串串操操作作,由由标标志志寄寄存存器器的的DF=1决决定定,可可以以通通过过指令指令STD置置DF=1。南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v下面通过几个实例说明串操作指令与一般下面通过几个实例说明串操作指令与一般MOV指令实现数指令实现数据传送的区别据传送的区别:v例例10-1MOV指令应用实例指令应用实例v题目:将串题目:将串S1从数据段传送到辅助数据段中的串从数据段传送到辅助数据段中的串S2中去。中去。v设计思路:用设计思路:用MOV指令实现数据移动,指令实现数据移动,DS:SI指向指向S1源串,源串,ES:DI指向指向S2目标
9、串,每移动一次数据,目标串,每移动一次数据,SI和和DI分别加分别加1,用用LOOP指令实现所有数据的传送。指令实现所有数据的传送。例例10-1MOV指令应用实例指令应用实例v程程序序说说明明:以以上上程程序序如如果果用用字字符符串串传传送送指指令令LODSB和和STOSB来实现,程序可以修改为例来实现,程序可以修改为例10-2所示所示 南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v例例10-2LODSB和和STOSB串操作指令应用实例串操作指令应用实例v题目:功能同例题目:功能同例10-1v设计思路:设计思路:S1作为源串,作为源串,S2作为目标串,用串操作作为目标串,用串操
10、作LODSB和和STOSB实现串数据传送。实现串数据传送。例例10-2LODSB和和STOSB串操作指令应用实例串操作指令应用实例v程程序序说说明明:试试比比较较例例10-1与与例例10-2黑黑体体字字部部分分的的不不同同 南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v例例10-3MOVSB串操作指令应用实例串操作指令应用实例v题目:功能同例题目:功能同例10-1v设计思路:设计思路:S1作为源串,作为源串,S2作为目标串,用作为目标串,用MOVSB实现实现串数据传送串数据传送例例10-3MOVSB串操作指令应用实例串操作指令应用实例v程程序序说说明明:注注意意本本例例与与例例
11、10-1与与例例10-2黑黑体体字字部部分分的区别的区别南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v例例10-4REPMOVSB串操作指令应用实例。串操作指令应用实例。v题目:功能同例题目:功能同例10-1。v设计思路:设计思路:S1作为源串,作为源串,S2作为目标串,用作为目标串,用REPMOVSB实现串数据传送。实现串数据传送。例例10-4REPMOVSB串操作指令应用实例串操作指令应用实例v程程序序说说明明:与与例例10-1、10-2、10-3比比较较,本本例例更更简简单单。MOVSB,再再加加上上一一个个重重复复前前缀缀,那那么么整整个个循循环环的的重重复复部部分、修
12、改部分、控制部分用一条指令即可:分、修改部分、控制部分用一条指令即可:REPMOVSB。 南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述v例例10-1中的如下程序段,可以用串操作中的中的如下程序段,可以用串操作中的3种方法来替种方法来替代。代。L:MOVAL,SIMOVES:DI,ALINCSIINCDILOOPL方法一:方法一:L:LODSBSTOSBLOOPL南开大学南开大学朱耀庭朱耀庭2.串操作指令概述串操作指令概述方法二:方法二:L:MOVSBLOOPL方法三:方法三:REPMOVSBv由此可由此可见,REPMOVSB一条指令就可以一条指令就可以实现原来的一段原来的一段循
13、循环程序。程序。这就是串操作的就是串操作的优点,也是指令系点,也是指令系统的一种改的一种改进,即循,即循环程序以指令化的形式出程序以指令化的形式出现。v可可见硬件重复比通硬件重复比通过指令序列来指令序列来实现对字字节串或字串的循串或字串的循环处理要理要简便便许多。多。 南开大学南开大学朱耀庭朱耀庭10.2字符串操作指令字符串操作指令v硬件假设源字符串驻留在当前的数据段中,也就是说,用硬件假设源字符串驻留在当前的数据段中,也就是说,用DS段基址寄存器寻址。当然,可以用一个段前缀字节否定段基址寄存器寻址。当然,可以用一个段前缀字节否定这一假设,具体详见第这一假设,具体详见第4章寻址方式一节。章寻址
14、方式一节。v目的字符串必须在当前的附加段内,也就是说,用目的字符串必须在当前的附加段内,也就是说,用ES段基段基址寄存器寻址,并且不能用加段前缀的方法修改。汇编程址寄存器寻址,并且不能用加段前缀的方法修改。汇编程序检查操作数的属性,以确定字符串中的元素是字节还是序检查操作数的属性,以确定字符串中的元素是字节还是字。但是,汇编程序并不用操作数的名称来访问字符串,字。但是,汇编程序并不用操作数的名称来访问字符串,而是以而是以SI(源变址源变址)寄存器的内容作为位移量来访问源字符寄存器的内容作为位移量来访问源字符串当前的那个元素。并用串当前的那个元素。并用DI(目的变址目的变址)寄存器的内容作为寄存
15、器的内容作为当前目的串元素的位移量。也就是说,用地址表达式当前目的串元素的位移量。也就是说,用地址表达式DS:SI访问源串,用访问源串,用ES:DI访问目的串。访问目的串。v因此,在执行字符串指令之前,必须对因此,在执行字符串指令之前,必须对SI和和DI寄存器进行寄存器进行预置,将源字符串和目的字符串的头或尾的位移量分别送预置,将源字符串和目的字符串的头或尾的位移量分别送至至SI和和DI中。中。南开大学南开大学朱耀庭朱耀庭10.2字符串操作指令字符串操作指令v字符串操作指令可对内存单元按字节、字或双字进行处理,字符串操作指令可对内存单元按字节、字或双字进行处理,并能根据操作对象的字节数使变址寄
16、存器并能根据操作对象的字节数使变址寄存器SI、DI增减增减1、2或或4。v串操作具体顺序如下:串操作具体顺序如下:(1)根据需要使根据需要使DS:SI指向源串,指向源串,ES:DI指向目指向目标串。串。(2)根据需要由指令根据需要由指令CLD置置标志志DF=0,使串操作,使串操作为地址地址递增增的正向串操作;由指令的正向串操作;由指令STD置置标志志DF=1,使串操作,使串操作为地地址址递减的减的负向串操作。向串操作。v注意:程序的缺省状注意:程序的缺省状态是是DF=0。南开大学南开大学朱耀庭朱耀庭10.2字符串操作指令字符串操作指令v串操作具体顺序如下:串操作具体顺序如下:(3)执行串操作指
17、令的功能。行串操作指令的功能。(4)若若DF=0时,根据指令功能寄存器,根据指令功能寄存器SI(和和/或或DI)依字依字节、字、字、双字操作分双字操作分别增加增加1(字字节)、2(字字)或或4(双字双字)。否否则,若,若DF=1,寄存器,寄存器SI(和和/或或DI)依字依字节、字、双字、字、双字操作分操作分别减少减少1(字字节)、2(字字)或或4(双字双字)。南开大学南开大学朱耀庭朱耀庭10.2字符串操作指令字符串操作指令取字符串数据指令取字符串数据指令LODS1字符串传送指令字符串传送指令MOVS3字符串扫描指令字符串扫描指令SCAS5存字符串数据指令存字符串数据指令STOS2字符串比较指令
18、字符串比较指令CMPS南开大学南开大学朱耀庭朱耀庭1.取字符串数据指令取字符串数据指令LODSv取字符串数据指令取字符串数据指令LODS(LoadStringInstruction)v格式:格式:LODSsource;source为字符串源地址为字符串源地址LODSB/LODSW;字节字节/字字LODSD;80386+v功能:功能:LODS指令将指令将SI指向的源串元素根据其地址表达式指向的源串元素根据其地址表达式的属性来决定读取一个字节、字或双字,将其传送到的属性来决定读取一个字节、字或双字,将其传送到AL,AX或或EAX,同时根据,同时根据DF和串的类型修改和串的类型修改SI的内容使之指的
19、内容使之指向串的下一个元素。指令功能描述如图向串的下一个元素。指令功能描述如图10-1所示,其应用所示,其应用实例见例实例见例10-2。南开大学南开大学朱耀庭朱耀庭1.取字符串数据指令取字符串数据指令LODSv该该指指令令不不涉涉及及目目标标串串,故故DI的的值值保保持持不不变变。一一般般使使用用LODS指令不加重复前缀。指令不加重复前缀。图图10-1LODS指令功能示意图指令功能示意图南开大学南开大学朱耀庭朱耀庭2.存字符串数据指令存字符串数据指令STOSv存字符串数据指令存字符串数据指令STOS(StoreStringInstruction)v格式:格式:STOSdestination;d
20、estination为目目标字符串的目字符串的目的地址的地址STOSB/STOSW;字字节/字字STOSD;80386+v功能:功能:STOS指令将累加器指令将累加器AL、AX或或EAX的内容传送到的内容传送到由由ES:DI所指向的目的串中,同时根据所指向的目的串中,同时根据DF和串的类型修改和串的类型修改DI以指向下一个串元素。指令功能描述如图以指向下一个串元素。指令功能描述如图10-2所示,其所示,其应用实例见例应用实例见例10-3。南开大学南开大学朱耀庭朱耀庭2.存字符串数据指令存字符串数据指令STOSv注注意意:LODS,STOS指指令令都都不不影影响响状状态态标标志志寄寄存存器器的的
21、状状态态 图图10-2STOS指令功能示意图指令功能示意图南开大学南开大学朱耀庭朱耀庭2.存字符串数据指令存字符串数据指令STOSv例例10-5LODS,STOS综合应用实例。综合应用实例。v题目:若在一片内存区中有一符号序列,起始地址为题目:若在一片内存区中有一符号序列,起始地址为CHUAN。符号序列中有字母和数字两种符号,要求把其。符号序列中有字母和数字两种符号,要求把其中的字母和数字符号分开,分别放在同一段的两个空间,中的字母和数字符号分开,分别放在同一段的两个空间,存放字母的空间起始地址为存放字母的空间起始地址为ZIFU;存放数字符号的空间起;存放数字符号的空间起始地址为始地址为SHU
22、Z。v设计思路:编写该程序时,可设设计思路:编写该程序时,可设SI为原符号序列指针,设为原符号序列指针,设DI和和BX分别为存放字符和数字符号的目标区指针,使用分别为存放字符和数字符号的目标区指针,使用LODS指令把原数据取至指令把原数据取至AL中,然后测试其是字母还是数中,然后测试其是字母还是数字符号,若是字母,则用字符号,若是字母,则用STOSB指令送到字母区;若是指令送到字母区;若是数字,则可以先把数字,则可以先把DI与与BX交换,然后再用交换,然后再用STOSB指令送指令送至数字区,最后再将至数字区,最后再将DI与与BX的内容交换过来。用的内容交换过来。用CX来来控制循环次数。控制循环
23、次数。南开大学南开大学朱耀庭朱耀庭2.存字符串数据指令存字符串数据指令STOSv 程序说明:程序说明:vCMPS指令加上前缀指令加上前缀REPE或或REPZ,操作解释为:如果,操作解释为:如果没有到串尾没有到串尾(CX0)且串是相等的且串是相等的(ZF1)则继续比较,否则继续比较,否则顺序执行。其中每比较一次则顺序执行。其中每比较一次CX自动减自动减1。vCMPS指令加上前指令加上前缀REPNE或或REPNZ,操作解,操作解释为:如:如果没有到串尾果没有到串尾(CX0)且串是不相等的且串是不相等的(ZF0)则继续比比较,否否则顺序序执行。其中每比行。其中每比较一次一次CX自自动减减1。例例10
24、-5LODS,STOS综合应用实例综合应用实例南开大学南开大学朱耀庭朱耀庭3.字符串传送指令字符串传送指令MOVSv字符串传送指令字符串传送指令MOVS(MoveStringInstruction)v格式:格式:MOVSdestination,source;destination为目目标串的串的目的地址,目的地址,source为源字符串源地址源字符串源地址MOVSB/MOVSW;字;字节/字字MOVSD;80386+v功能:功能:MOVS指令是把指令是把DS:SI所指向的字节、字或双字传所指向的字节、字或双字传送给送给ES:DI所指向的内存单元,并根据标志位所指向的内存单元,并根据标志位DF和
25、串的类和串的类型修改寄存器型修改寄存器DI和和SI。指令的执行不影响任何标志位。指。指令的执行不影响任何标志位。指令功能描述如图令功能描述如图10-3所示,应用实例见例所示,应用实例见例10-3、例、例10-4。南开大学南开大学朱耀庭朱耀庭3.字符串传送指令字符串传送指令MOVSvMOVS指令前可以加前指令前可以加前缀操作操作REP成成为REPMOVS,其,其作用如同以下的指令序列:作用如同以下的指令序列:L:MOVSLOOPL图图10-3MOVS指令功能示意图指令功能示意图南开大学南开大学朱耀庭朱耀庭4.字符串比较指令字符串比较指令CMPSv字符串比较指令字符串比较指令CMPS(Compar
26、eStringInstruction)v格式:格式:CMPSsource,destination;destination为目的字符串地目的字符串地址,址,source为源字符串地址源字符串地址CMPSB/CMPSWCMPSD;80386+v功能:功能:CMPS指令是把指令是把DS:SI和和ES:DI指向的字节、字或双指向的字节、字或双字的值相减,将结果反映到状态标志位上,而不送至任何字的值相减,将结果反映到状态标志位上,而不送至任何一个操作数。同时修改一个操作数。同时修改SI和和DI使之指向下一个元素。标志使之指向下一个元素。标志位位AF,CF,OF,PF,SF和和ZF反映了目的串和源串对应反
27、映了目的串和源串对应元素之间的关系。指令功能描述如图元素之间的关系。指令功能描述如图10-4所示,其应用实所示,其应用实例见例例见例10-6。南开大学南开大学朱耀庭朱耀庭4.字符串比较指令字符串比较指令CMPSvCMPS指令前可以加前指令前可以加前缀操作操作REPE成成为REPECMPS,其作用如同以,其作用如同以下的指令序列:下的指令序列:L:CMPS;比;比较一次一次LOOPEL;CX减减1送送CX,CX不不为0且且ZF1转L,否,否则顺序序执行行vCMPS指令前也可以加前指令前也可以加前缀操作操作REPNE成成为REPNECMPS,其作,其作用如同以下的指令序列:用如同以下的指令序列:L
28、:CMPS;比;比较一次一次LOOPNEL;CX减减1送送CX,CX不不为0且且ZF0转L,否,否则,顺序序执行行图图10-4CMPS指令功能示意图指令功能示意图南开大学南开大学朱耀庭朱耀庭4.字符串比较指令字符串比较指令CMPSv例例10-6CMPS应用实例。应用实例。v题目:查找一个字符串是否存在另一个串中。题目:查找一个字符串是否存在另一个串中。v设计思路:利用设计思路:利用REPECMPS指令比较两个字符串,查找指令比较两个字符串,查找源串中是否有目标串中的短语。若有则显示字符串源串中是否有目标串中的短语。若有则显示字符串“FOUND”,同时以,同时以16进制形式显示要找的短语在源串中
29、进制形式显示要找的短语在源串中的起始位移;否则,显示字符串的起始位移;否则,显示字符串“NOTFOUND”。例例10-6CMPS应用实例应用实例v程程序序说说明明:修修改改程程序序中中的的指指令令REPECMPSB,用用不不带带前前 缀缀 REPE的的 指指 令令 CMPSB来来 实实 现现 。 并并 且且 请请 修修 改改SOURCEDBIREALLYLOVENANKAI!使使其其中中不不含含LOVENANKAI,看看结果如何。,看看结果如何。 南开大学南开大学朱耀庭朱耀庭5.字符串扫描指令字符串扫描指令SCASv字符串扫描指令字符串扫描指令SCAS(ScanStringInstructio
30、n)v格式:格式:SCASdestination;destination为扫描累加器值的为扫描累加器值的字符串地址字符串地址SCASB/SCASW;字节字节/字字SCASD;80386+v功能:功能:SCAS指令从累加器指令从累加器AL,AX或或EAX中减去由中减去由ES:DI指向的目指向的目标串中的元素,串中的元素,结果不送到任何地方,只改果不送到任何地方,只改变状状态标志位;同志位;同时,根据,根据DF和串的和串的类型修改型修改DI,使之指向,使之指向串的下一个元素。受影响的串的下一个元素。受影响的标志位包括志位包括AF,CF,OF,PF,SF和和ZF。南开大学南开大学朱耀庭朱耀庭5.字符
31、串扫描指令字符串扫描指令SCASv功能:功能:SCAS指令加上前指令加上前缀REPE或或REPZ,操作解,操作解释为:执行比行比较一次,一次,CX自自动减减1,如果没有到串尾,如果没有到串尾(CX0)且当前串且当前串中含有中含有AL/AX的元素的元素(ZF1)则继续搜索,否搜索,否则顺序序执行。行。SCAS指令加上前指令加上前缀REPNE或或REPNZ,操作解,操作解释为:执行比行比较一次,一次,CX自自动减减1,如果没有到串尾,如果没有到串尾(CX0)且当前且当前串中不含有串中不含有AL/AX的元素的元素(ZF0)则继续搜索,否搜索,否则顺序序执行。行。南开大学南开大学朱耀庭朱耀庭5.字符串
32、扫描指令字符串扫描指令SCASv例例10-7SCAS指令应用实例。指令应用实例。v题目:从键盘输入一个字符,寻找指定串中是否存在该字题目:从键盘输入一个字符,寻找指定串中是否存在该字符。符。v设计思路:利用设计思路:利用REPNESCAS指令在指定的串中逐个搜指令在指定的串中逐个搜索是否含有由键盘输入的指定字符。若含有,则用索是否含有由键盘输入的指定字符。若含有,则用16进制进制数逐个显示其出现的位置,如果一个也不含有则输出数逐个显示其出现的位置,如果一个也不含有则输出N结结束。束。例例10-7SCAS指令应用实例指令应用实例v程程序序说说明明:修修改改程程序序中中的的指指令令REPNESCA
33、SB,用用不不带带前缀前缀REPNE的指令的指令SCASB来实现来实现南开大学南开大学朱耀庭朱耀庭10.3串操作指令的重复前串操作指令的重复前缀v例例10-4、例、例10-6和例和例10-7使用到了串操作指令的前缀使用到了串操作指令的前缀REP,REPZ/REPE和和REPNZ/REPNE,本节是对这些前缀用法的小结。,本节是对这些前缀用法的小结。v基本串操作指令前面根据需要,在指令前可以加一个专用的单字节前基本串操作指令前面根据需要,在指令前可以加一个专用的单字节前缀,以便硬件能重复执行该指令。这就使得串操作比用缀,以便硬件能重复执行该指令。这就使得串操作比用MOV或或CMP指令序列通过循环
34、进行处理要快得多。串操作重复前缀有:指令序列通过循环进行处理要快得多。串操作重复前缀有:REP执行串操作一次,执行串操作一次,CX自动减自动减1,CX不为不为0则重复,否则顺序执行则重复,否则顺序执行REPE/REPZ执行串操作一次,执行串操作一次,CX自动减自动减1,CX不为不为0且且ZF1(相相等等)时重复时重复REPNE/REPNZ执行串操作一次,执行串操作一次,CX自动减自动减1,CX不为不为0且且ZF0(不不相等相等)时重复时重复应用重复前缀可以按规定的各种条件结束重复过程,重复过程可被中应用重复前缀可以按规定的各种条件结束重复过程,重复过程可被中断或重新开始。断或重新开始。南开大学
35、南开大学朱耀庭朱耀庭10.3串操作指令的重复前串操作指令的重复前缀重复前缀重复前缀REP1相等重复前缀相等重复前缀REPZ/REPE2不等重复前缀不等重复前缀REPNZ/REPNE南开大学南开大学朱耀庭朱耀庭1.重复前缀重复前缀REPvREP可以使用在前面介可以使用在前面介绍的某些串操作指令的前面,例如:的某些串操作指令的前面,例如:REPLODSREPSTOSREPMOVSv其重复的次数由寄存器其重复的次数由寄存器CX来决定,被解释为来决定,被解释为“字符串未完字符串未完(CX0)则则重复重复”。其执行时步骤如下:。其执行时步骤如下:(1)执行串操作一次。行串操作一次。(2)CX自自动减减1
36、。(3)CX不不为0则重复,否重复,否则顺序序执行。行。v尽管尽管REP可以和众多指令联合使用,但是当可以和众多指令联合使用,但是当LODS指令与指令与REP联用时,联用时,总是把一串数据送入总是把一串数据送入AL,AX或或EAX中,到结束时,只留下了最后一中,到结束时,只留下了最后一个数据。这样做达不到效果,所以个数据。这样做达不到效果,所以REP一般不与一般不与LODS联用。联用。南开大学南开大学朱耀庭朱耀庭2.相等重复前缀相等重复前缀REPZ/REPEvREPZ和和REPE是同一前是同一前缀的两种不同写法,的两种不同写法,Z表示表示结果果为0(ZF1),E表示相等表示相等(ZF1)。vR
37、EPZ/REPE通常与通常与CMPS及及SCAS共同使用,例如:共同使用,例如:REPZCMPSREPECMPSREPZSCASREPESCASv其重复的次数由寄存器其重复的次数由寄存器CX和和ZF共同决定,被解共同决定,被解释为没有到字符串尾没有到字符串尾而且相等重复,否而且相等重复,否则顺序序执行。其行。其执行行时步步骤如下:如下:(1)执行串操作一次。行串操作一次。(2)CX自自动减减1。(3)CX不不为0而且相等(而且相等(ZF1)则重复,否重复,否则顺序序执行。行。南开大学南开大学朱耀庭朱耀庭3.不等重复前缀不等重复前缀REPNZ/REPNEvREPNZ和和REPNE是同一前是同一前
38、缀的两种不同写法,的两种不同写法,NZ表示表示结果不果不为0(ZF0),),NE表示不相等(表示不相等(ZF0)vREPNZ/REPNE通常与通常与CMPS及及SCAS共同使用,例如:共同使用,例如:REPNZCMPSREPNECMPSREPNZSCASREPNESCASv其重复的次数由寄存器其重复的次数由寄存器CX和和ZF共同决定,被解共同决定,被解释为没有到字符串尾没有到字符串尾而且不相等重复,否而且不相等重复,否则顺序序执行。其行。其执行行时的步的步骤如下:如下:(1)执行串操作一次。行串操作一次。(2)CX自自动减减1。(3)CX不不为0而且不相等(而且不相等(ZF0)则重复,否重复,否则顺序序执行。行。注意:重复前注意:重复前缀指令中的指令中的CX自自动减减1不影响不影响标志位。志位。南开大学南开大学朱耀庭朱耀庭-朱耀庭南开大学南开大学朱耀庭朱耀庭