能力值:
(RANK:410 )
|
-
-
2 楼
这个是最经典的求字符串长度的代码。
33C0 xor eax, eax
F2:AE repne scas byte ptr es:[edi] ; 这里不明白。
扫描字符串ES:[EDI]中的AL字节值,遇到AL值停止
|
能力值:
( LV8,RANK:130 )
|
-
-
3 楼
晕菜~
谢谢版主。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
整段意思是计算字符串长度
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我也想知道这个是怎么样的计算过程
有哪位大侠知道的 帮忙解释下
|
能力值:
(RANK:350 )
|
-
-
6 楼
http://bbs.pediy.com/showthread.php?t=50879
7楼
strlen()在VC优化编译模式是这段代码。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
参考:
重复前缀指令
任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数隐含在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'的实际长度
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
学习,谢谢了。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
为什么出现两个第三次呢。不明白
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我在vc环境下查了strlen()函数的汇编,具有类似的形式
很奇怪为什么是or ecx,-1
而不是mov ecx,-1
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
2个是一样的作用:
or ecx,-1相当于or ecx,FFFFFFFF
mov ecx,-1相当于mov ecx,FFFFFFFF
都是将ecx置为全F
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
很详细,很认真!谢谢
|
能力值:
( LV6,RANK:90 )
|
-
-
16 楼
学习了
您输入的信息太短,您发布的信息至少为 6 个字符。
|