• REPNZ SCANS


    重复前缀指令
    任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数隐含在CX寄存器中
    REP        ;REP前缀用在MOVS、STOS、LODS指令前,每次执行一次指令,CX减1;直到CX=0,重复执行结束
    REPZ       ;也可以表把为REPE,用在CMPS、SCAS指令前,每执行一次串指令CX减1,并判断ZF标志是否为0
               ;只要CX=0或ZF=0,则重复执行结束
    REPNZ      ;也可以表达为REPNE,用在CMPS、SCAS指令前,每执行一次串操作指令CX减1,并判断ZF标志是否为1,只要CX=0或ZF=1,则重复执行结束。

    串扫描指令SCAS
    SCASB         ;字节串扫描:AL-ES:[DI],DI←DI+/-1
    SCASW         ;字串扫描:AX-ES:[DI],DI←DI+/-2
    串扫描指令SCAS将附加段中的字节或字内容与AL/AX寄存器内容进行比较,根据比较的结果设置标志,每次比较后修改DI寄存器的值,使之指向下一个元素。
    00401099 8d7df8          lea     edi,[ebp-8]
    0040109c 83c9ff          or      ecx,0FFFFFFFFh
    0040109f 33c0            xor     eax,eax
    004010a1 f2ae            repne scas byte ptr es:[edi]
    004010a3 f7d1            not     ecx
    004010a5 83c1ff          add     ecx,0FFFFFFFFh


    00401099 8d7df8          lea     edi,[ebp-8]:取得字符串地址到edi中,

    0:000> db edi
    0012ff34  44 62 67 00 44 62 67 00-48 ff 12 00 df 10 40 00  Dbg.Dbg.H.....@.
    

    0040109c 83c9ff          or      ecx,0FFFFFFFFh:把ecx设置为oxffffffff,这样,每次CX-1,cx就不会为0

    0040109f 33c0            xor     eax,eax:对较的是AL/AX内容,这里把它们设置为0,也就和0比对

    那么比对开始:

    004010a1 f2ae            repne scas byte ptr es:[edi]:即edi所指字符串和al(即为0)对较,

    第一次

    al比对'D',di=di-1,即byte ptr es:[edi]指向'b',并置相应的标志位

    然后cx-1,则ecx=FFFFFFFE,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行

    第二次

    al比对'b',di=di-1,即byte ptr es:[edi]指向'g',并置相应的标志位

    然后cx-1,则ecx=FFFFFFFD,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行

    第三次

    al比对'g',di=di-1,即byte ptr es:[edi]指向'0',并置相应的标志位

    然后cx-1,则ecx=FFFFFFFC,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行

    第四次

    al比对'g',di=di-1,即byte ptr es:[edi]指向'D',并置相应的标志位

    然后cx-1,则ecx=FFFFFFFB,判断是否cx=0或ZF=1,显然该处条件ZF=1成立,结束执行

    0:000> r ecx, edi
    ecx=fffffffb edi=0012ff38
    0:000> db edi
    0012ff38  44 62 67 00 48 ff 12 00-df 10 40 00 54 80 40 00  Dbg.H.....@.T.@.
    
    004010a3 f7d1            not     ecx:ecx求反,1变成0,0变成1,即:

    0:000> r ecx
    ecx=00000004
    
    004010a5 83c1ff          add     ecx,0FFFFFFFFh:ecx-1=3为字符串的长度了!



  • 相关阅读:
    ShowModalDialog的一个Demo
    DockPanel的一点点改进
    使用Ado.net获取数据库架构信息
    华为离职感受
    一个简单的LINQ TO SQL的三层架构的例子
    [CSharp]volatile访问修饰方法定义
    [JWS]JavaScript访问AD,查用户所属的组
    [WCF]相关资料整理
    [CSharp]使用MSSOAPLib30调用WS的身份验证问题
    [Linux]使用光驱
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693425.html
Copyright © 2020-2023  润新知