zoukankan      html  css  js  c++  java
  • 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为字符串的长度了!



  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693425.html
Copyright © 2011-2022 走看看