zoukankan      html  css  js  c++  java
  • 汇编学习笔记(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 其实就是偏移位置
  • 相关阅读:
    Linq技术四:动态Linq技术 -- Linq.Expressions
    74HC595的中文资料
    MessageDigest简单介绍
    gpu显存(全局内存)在使用时数据对齐的问题
    走进windows编程的世界-----windows进程
    Matlab画图-非常具体,非常全面
    php实现 合并表记录(需求是最好的老师)
    php实现求一个数的质数因子
    php课程 4-16 数组自定义函数(php数组->桶)
    jquery-3 jquery选择器
  • 原文地址:https://www.cnblogs.com/alwaysking/p/12257391.html
Copyright © 2011-2022 走看看