有關repne scas byte ptr es:[edi]

strlen()在VC優化編譯模式下的代碼:

   .  8D7C24 10     lea     edi, dword ptr [esp+10]          ;  esp+10 指向字符串
   .  83C9 FF       or      ecx, FFFFFFFF
   .  33C0          xor     eax, eax
   .  F2:AE         repne   scas byte ptr es:[edi]           
   .  F7D1          not     ecx
   .  49            dec     ecx
參考:

重複前綴指令
任何一個串操作指令,都可以在前面加一個重複前綴,以實現串操作的重複執行,重複次數隱含在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寄存器的值,使之指向下一個元素。


解釋:
假設esp+10指向字符串如:"xqiang",長度爲6,以0結尾
ecx=FFFFFFFF
eax=0,則al=0
執行repne scas時候:
第一次:
al-'x',di=di-1,即byte ptr es:[edi]指向'q',並置相應的標誌位
然後cx-1,則ecx=FFFFFFFE,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第二次:
al-'q',di=di-1,即byte ptr es:[edi]指向'i',並置相應的標誌位
然後cx-1,則ecx=FFFFFFFD,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第三次:
al-'i',di=di-1,即byte ptr es:[edi]指向'a',並置相應的標誌位
然後cx-1,則ecx=FFFFFFFC,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第三次:
al-'a',di=di-1,即byte ptr es:[edi]指向'n',並置相應的標誌位
然後cx-1,則ecx=FFFFFFFB,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第四次:
al-'n',di=di-1,即byte ptr es:[edi]指向'g',並置相應的標誌位
然後cx-1,則ecx=FFFFFFFA,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第五次:
al-'g',di=di-1,即byte ptr es:[edi]指向'0',並置相應的標誌位
然後cx-1,則ecx=FFFFFFF9,判斷是否cx=0或ZF=1,顯然該處條件不成立,繼續重複執行
第六次:
al-0,di=di-1,即byte ptr es:[edi]指向'未知字符',並置相應的標誌位
然後cx-1,則ecx=FFFFFFF8,判斷是否cx=0或ZF=1,此時ZF=1,停止串搜索
現在ecx從FFFFFFFF到FFFFFFF8記錄了字符串'xqiang'和0的長度
然後not ecx得到ecx=00000007
dec ecx得到ecx=00000006 該長度就是字符串'xqiang'的實際長度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章