代码优化的例子

作者在 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
 
代码段二:
    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 
======================================
最后,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 
====================================
但是,两段代码的长度还是有4个字节的差别.可见,代码段一确实是经典~~
文章评论,共2条
ONEPROBLEM(作者)
2008-09-07 23:35
1
不知道代码段二还能不能再优化一下~~
你们都要疼我哦
2008-09-08 02:06
2
代码1是直接对应机器码的指令,repne也隐含了终止条件,这段代码是直接会一点不动的出现在反汇编里的.<br />
代码2含有标号,而且也会多出比较语句,经过反汇编后,跳转 标号这些都会增加进去,你可以看看那2个跳转会被反汇编成什么形式.<br />
你也学起反汇编啊. 这个好玩.
游客请输入验证码