作者在 2008-09-07 23:34:26 发布以下内容
两段代码,实现的功能是相同的,但代码的长度却有较大区别.
代码段一:
mov edi, offset szText
or ecx,0FFFFFFFFH
xor eax, eax
repne scas BYTE ptr es:[edi]
not ecx
dec ecx
or ecx,0FFFFFFFFH
xor eax, eax
repne scas BYTE ptr es:[edi]
not ecx
dec ecx
代码段二:
mov edi, offset szText
or ecx,0FFFFFFFFH
xor eax, eax
s1:
push ecx
mov al,[edi]
cmp al,0
je s2
inc edi
pop ecx
loop s1
s2:
not ecx
or ecx,0FFFFFFFFH
xor eax, eax
s1:
push ecx
mov al,[edi]
cmp al,0
je s2
inc edi
pop ecx
loop s1
s2:
not ecx
======================================
最后,ecx都返回了所要检测的字符串的字符数.但是,通过反汇编得知,这两段代码的长度差别是8个字节!
代码段二还是可以优化的:
mov edi, offset szText
or ecx,0FFFFFFFFH
s1:
mov al,[edi]
cmp al,0
je s2
inc edi
loop s1
s2:
not ecx
or ecx,0FFFFFFFFH
s1:
mov al,[edi]
cmp al,0
je s2
inc edi
loop s1
s2:
not ecx
====================================
但是,两段代码的长度还是有4个字节的差别.可见,代码段一确实是经典~~