汇编学习笔记(12)

字符串操作指令

  基础设定

    操作分为源地址目标地址,表示源地址目标地址的寄存器组合都是规定和不能变更的。

    源地址:   DS: SI

    目标地址:  ES: DI

  

  LODS

     描述: 从 源地址(DS: SI加载一个 BYTE/WORD 到 AL 或者 AX寄存器, 同时根据DF的值以及传送数的尺寸 ++ 或者 --  SI的值

         LODSB:   [DS:SI] => AL;  SI --; / SI ++;
         LODSW:  [DS:SI] => AX;  SI -= 2; / SI += 2;

  STOS

     描述:  从 AL或者AX寄存器写 一个BYTE/WORD到目标地址(ES: DI, 同时根据DF的值以及传送数的尺寸 ++ 或者 --  SI的值

         LODSB:   AL => [ES:DI] ;  DI--; / DI++;
         LODSW:  AX => [ES:DI] DI-= 2; / DI+= 2;

  MOVS

     描述:  从  源地址(DS: SI写 一个BYTE/WORD到目标地址(ES: DI, 同时根据DF的值以及传送数的尺寸 ++ 或者 --  SI的值

         MOVSB:   [DS:SI] => [ES:DI] ;  SI --; DI --;  / SI ++; DI ++;
         MOVSW:  [DS:SI] => [ES:DI;  SI -= 2; DI -= 2; / SI += 2; DI += 2;
     实际等效果于 LODSSTOS 联用

  SCAS

     描述:  AL 或者 AX寄存器 与 目标地址(ES: DI的一个BYTE/WORD比较,影响标志标志寄存器, 同时根据DF的值以及传送数的尺寸 ++ 或者 --  SI的值

         MOVSB:   AL - [ES:DI] ;  DI--; / DI++;
         MOVSW:  AL - [ES:DI;   DI-= 2; / DI+= 2;
     之后可以通过判断标记为知道比较结果
 

  CMPS

     描述:  源地址(DS: SI 与 目标地址(ES: DI的一个BYTE/WORD比较,影响标志标志寄存器, 同时根据DF的值以及传送数的尺寸 ++ 或者 --  SI的值

         MOVSB:   [DS:SI] - [ES:DI] ;  SI --; DI --;  / SI ++; DI ++;
         MOVSW:  [DS:SI] - [ES:DI;  SI -= 2; DI -= 2; / SI += 2; DI += 2;
     之后可以通过判断标记为知道比较结果

循环指令前缀

   前面介绍的字符串比较指令,单独用起来似乎功能不是很强,但配合上循环指令,功能就立马厉害起来了。

  REP / REP

    用法 :

      REP  [字符比较指令]

      REP  [字符比较指令]

    解释:

      当 CX != 0 的时候循环执行 其后的字符串操作指令

      比如:

        REP  CMPSB       等效于           work :   CMPSB         等效于      while( cx != 0){

                           LOOP work             CMPS    }

    举例: 

      REP  SCASB

      REP  CMPSB

  REPZ / REPE

    用法 :

      REPZ  [字符比较指令]

      REPE  [字符比较指令]

    解释:

      当 CX != 0  并且  ZF= 1 的时候循环执行其后的字符串操作指令

      比如:

        REPZ  CMPSB      等效于      while( cx != 0 && ZF == 1){

                          CMPS    }

    举例: 

      REPZ  SCASB

      REPZ  CMPSB

  REPNZ / REPNE

    用法 :

      REPNZ  [字符比较指令]

      REPNE  [字符比较指令]

    解释:

      当 CX != 0  并且  ZF == 0 的时候循环执行其后的字符串操作指令

      比如:

        REPNZ  CMPSB      等效于      while( cx != 0 && ZF == 0){

                          CMPS    }

    举例: 

      REPNZ  SCASB

      REPNZ  CMPSB

使用举例   

  ; 程序未经检查
  ;  从字符串中查找字符
  section .data
       strMess: db "HelloZ!"
       strlen equ $-strMess

  section .text
 
      mov ax, strMess ; 
      mov di, ax                ; 设置DI的地址

      mov cx, strlen     ; CX = 串长度
 
      mov al, 'z'        ; 设置要查找的字符是 z 
      repnz scasb       ; 如果 cx != 0 && 字符 != z 则一直循环
                           ; 找到之后 strlen - cx 其实就是偏移位置
原文地址:https://www.cnblogs.com/alwaysking/p/12257391.html