串操作指令

来源:互联网 发布:汇编语言转c语言 编辑:程序博客网 时间:2024/04/28 13:39

串操作类指令 

    在内存一个存储区域连续存放着若干个字节(或字)数据,这样一组数据称为数据串(高级语言视为数组)。若每个数据是一个字节,称字节串;若是字,则称字串。串操作指令可以用来实现内存区域的数据串操作。
 
1.重复前缀
   串操作指令每次只处理数据串中的一个数据,但与重复前缀配合使用(重复前缀+串操作指令),则可使操作重复进行(其执行过程相当于一个循环程序的运行,重复次数由寄存器CX决定)。重复前缀的几种形式见表1所示。 
                    表1 重复前缀
 汇编格式          执行过  影响指令            

REP
无条件重复
 


(1)(CX)02)CX=CX-1
(
3)4)重复(1)-(3)
执行后续串指令;
(
,则退出;
(
 MOVSSTOSLODS   


REPE/REPZ

相等/结果

0时重复

(1)(CX)0ZF=02)CX=CX-1
(
3)4)重复(1)-(3)执行后续串指令;
(
,则退出;
(
 CMPSSCAS

REPNE/REPNZ
不相等/结果
不为0时重复

 

(1)(CX)0ZF=12)CX=CX-1
(
3)4)重复(1)-(3) 执行后续串指令;
(
,则退出;
(

 

 CMPSSCAS


 2
.串操作指令

串操作指令共有五种(MOVS、STOS、LODS、CMPS、SCAS),其基本操作各不相同,但有以下共同特点:
      
1)源数据串在数据段,以寄存器SI作为地址指针。
        目的数据串在附加段,以寄存器DI作为地址指针。      
      
2)每次操作后,地址指针SIDI自动修改,修改的方向取决于方向标志DF
         DF
1DF=  0,地址指针增量(即字节操作加1,字操作加2)。
       3
串操作指令与重复前缀结合,可进行多次重复操作。   
      
4)串操作指令都具有3种指令格式:(以串传送指令MOVS为例)
        MOVS  dest,src    ;由操作数说明是字节或字操作
        MOVSB   ;字节操作
        MOVSW   ;字操作  
   
综上所述为实现串操作,程序设计时要掌握3个要点
    1)利用方向标志DF设定串操作中地址指针修改的方向。
    2)利用DSSIESDI设定源数据串和目的数据串的首地址。
    3)利用CX设定被处理数据串的字节个数或字个数(即数据串中数据个数) 。 

                       
  MOVS指令(串传送)的功能
,地址指针减量(即字节操作减1,字操作减2);
        

[(ES:DI)][(DS:SI)],即数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后根据DF及所传送数据的类型(字节或字)SIDI进行修改(SISI±1,DIDI±1或SISI±2,DIDI±2)。在重复前缀REP的控制下,可将数据段中的整串数据传送到附加段中去。

 

from: http://www.gxjmzy.com/dfwjyl/Article_Print.asp?ArticleID=66

 【例】把数据段中从符号地址STR1开始的100个字节内容传送到附加段中从STR2开始的单元中。
             CLD                ;清方向标志DFDF0
    
       LEA   SI
STR1     ;(SI源串首地址指针
    
       LEA   DI
STR2     ;(DI目的串首地址指针 
    
       MOV  CX
100       ;(CX字节串长度          
    
       REP   MOVSB        
;字符串传送    
  实现上述功能的程序段如下:
      

 STOS指令(存串)的功能

AL/AX[(ES:DI)],即把指令中指定的一个字节或一个字(分别存放在ALAX寄存器中),传送到附加段中由DI间接寻址的字节单元(或字单元)中去,然后自动修改地址指针。在重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段存储区域中。

【例】对从符号地址STR2开始的256个字单元清0   
     CLD              LEA   DISTR2    ;(DI目的串首地址指针
   
 MOV  AX
0        AX寄存器清0
    
 MOV  CX
256      ;(CX字串长度
    
REP  STOSW
 ;清方向标志DF
    

  LODS指令(取串)的功能

  [(DS:SI)]AL/AX将数据串中的字节(或字)逐个装入寄存器AL(或AX)中。

  CMPS指令(串比较)的功能

[(DS:SI)]-[(ES:DI)],即把数据段中由SI间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作(即相减),使比较的结果影响标志位,然后自动修改地址指针。在重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,通常用于检查两个字符串是否相等。

【例】字符串STR1是数据段中的一个4字节字符串, STR2是附加段中的一个4字节字符串, 比较两字符串是否相等。      
          
CLD                 
;清方向标志DF
           LEA   SISTR1      ;(SI源串首地址指针 
    
       LEA   DI
STR2      ;(DI目的串首地址指针 
    
       MOV  CX
4          CX字节串长度
           REPE  CMPSB       
;若比较结果相等(ZF=1)且未比较完(CX
0)则继续比较下一个字节

  本例中退出REPE  CMPSB有两种可能:
     一种可能是在两字符串中找到不相等字符,从而退出,此时表明两字符串不相等,ZF=0
     另一种可能是两字符串中各字符都相等,一直到串比较完毕,从而退出,此时ZF=1CX=0
 故在退出后,可根据对ZF标志的检测来判断属于哪种可能。

  SCAS指令(串搜索)的功能
 
    AL/AX-[(ES:DI)],即把要搜索的关键字存放在AL(字节)或AX(字),将AL中的字节(或AX中的字)与附加段中由DI间接寻址的数据串中的一个字节(或字)进行比较操作(相减),使比较的结果影响标志位,然后自动修改地址指针,在指令重复前缀REPE/REPZREPNE/REPNZ的控制下,可在指定的数据串中搜索某一关键字

【例 搜索字符串STR中是否有字符‘M’,字符串长度为12   
           CLD
           LEA   DISTR        
    
       MOV  AL
'M'       关键字‘M
    
       MOV  CX
12         
    
       REPNE  SCASB       ;若比较结果不相等(ZF=0)且未比较完(CX
0)则继续比较下一个字节
AL

本例中退出REPNE  SCASB有两种可能:
     一种可能是已找到关键字,从而退出,此时ZF=1
     另一种可能是未搜索到关键字,但字符串已搜索完毕,从而退出,此时ZF=0CX=0
 故在退出后,可根据对ZF标志的检测来判断属于哪种可能。