一、说明
串操作指令用以处理内存中的数据串,但该操作每一次执行处理的只是单个字节或字,因此,对于数据串来说,需要重复执行串操作指令才能处理完整个串。
二、前缀指令
串操作指令的重复有特定的前缀指令配合。
1、REP 重复指令
其作用是重复执行串操作指令,直到寄存器CX=0为止,而每执行一次串操作指令,会使CX的内容自动减1,因此总的重复次数等于CX寄存器的初始值。
2、REPE/REPZ 相等/为零则重复指令【ZF是否为0】
只有当CX寄存器的值不等于0并且标志位ZF=1时,重复执行串操作指令。
若用以比较两个字符串是否相等,每次的串操作指令把源串中的一个字符和目的串中的一个字节进行比较,如果相等(即ZF=1),则还需要继续执行串操作指令,若不相等或者比较全部串的数据(CX=0),则停止。
3、REPNE/REPNZ 不相等/不为零则重复
只有当CX寄存器的值不等于0并且标志位ZF=0时,重复执行串操作指令。
若在一个字符串中查找是否存在某一个字符,串操作指令把字符串中的一个字节和要找的这个字符进行比较,如果不相等(即ZF=0),则还需要继续执行串操作指令,直到找到(ZF=1)或者查找完整个串的数据(CX=0),才停止。
三、MOVS 串传送指令
目的串地址:ES:[DI];源串地址:DS:[SI]
1、MOVSB:以字节为单位传送
操作:(ES:DI)<-(DS:SI),DI±1,SI±1
2、MOVSW:以字为单位传送
操作:(ES:DI)<-(DS:SI),DI±2,SI±2
注:当方向标志DF=0时,SI、DI用+;DF=1时SI、DI用-。
3、MOVS DST,SRC:将源串SRC传送到目的串DST中
4、方向标志DF的设置
CLD 设置正向(向前,使DF=0,SI或DI自动加)
STD 设置反向(向后,使DF=1,SI或DI自动减)
注:每次执行MOVS操作只能传送数据串中的一个字节或字,还需要与前缀REP联合使用,才可将数据段中的某个串全部传送到附加段中去。
四、CMPS 串比较指令
目的串地址:ES:[DI];源串地址:DS:[SI]
注:把两个串的对应位置的字节或字相减,不保存结果,只是根据结果设置标志位。
1、CMPSB(字节)
操作:(ES:DI)-(DS:SI),DI±1,SI±1
2、CMPSW(字)
操作:(ES:DI)-(DS:SI),DI±2,SI±2
注:在每次比较过程中,一旦发现不相等,ZF=0,则终止重复执行,而不必等到整个串全部比较结束,此时CX≠0,ZF=0;相等,ZF=1。
3、CMP DST,SRC
五、SCAS 串扫描指令
串扫描指令只涉及一个目标串,因而由ES:[DI]指定串的地址也好理解,默认源操作数AL(字节)或AX(字)。
1、SCASB(字节)
操作:AL-(ES:DI),DI±1
2、SCASW(字)
操作:AX-(ES:DI),DI±2
注:在每次执行传扫描指令过程中,一旦发现相等,即ZF=1,则终止执行,而此时CX≠0,ZF=0,说明已找到相同的内容,不必等到整个串全部扫描结束。
3、SCAS DST
六、STOS 串存入指令
1、STOSB(字节)
操作:(ES:DI)<-AL,DI±1
2、STOSW(字)
操作:(ES:DI)<-AX,DI±2
3、STOS DST
该指令把AL/AX寄存器的内容存入由目的变址寄存器指向附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。
当它与REP联用时,可把累加器的内容存入一个连续的内存缓冲区,该缓冲区长度由CX指定,因此STOS串指令可用于初始化某一块内存区。
七、LODS 从串中取数指令
1、LODSB(字节)
操作:AL<-(DS:SI),SI±1
2、LODSW(字)
操作:AX<-(DS:SI),SI±2