strlen和strcpy的识别

来源:互联网 发布:淘宝助理图片不显示 编辑:程序博客网 时间:2024/04/28 02:41

字符串处理函数通常会被编译器优化为内联函数,本文试分析VS2015下O2优化的strlen和strcpy的识别特征。

n = strlen(szHello);00409EA2 8D 45 E8             lea         eax,[szHello]         ;取字符串首地址00409EA5 83 C4 08             add         esp,8                 ;无关代码00409EA8 8D 50 01             lea         edx,[eax+1]           ;首地址加1  00409EAB 0F 1F 44 00 00       nop         dword ptr [eax+eax]   ;作用不明00409EB0 8A 08                mov         cl,byte ptr [eax]     ;逐个取字符00409EB2 40                   inc         eax                   ;自增00409EB3 84 C9                test        cl,cl                 ;判断是否为'\0'00409EB5 75 F9                jne         main+30h (0409EB0h)   ;do循环首  00409EB7 2B C2                sub         eax,edx               ;计算长度 

strlen特征:

lea     eax,[String]lea     edx,[eax+1]未知语句mov     cl,[eax]inc     eaxtest    cl,cljne     LoopBeginsub     eax,edx
    strcpy(szBuff, szHello);00409EA5 33 C0                xor         eax,eax                   ;eax清000409EA7 66 0F 1F 84 00 00 00 00 00 nop         word ptr [eax+eax]  ;未知语句  00409EB0 8A 4C 05 D4          mov         cl,byte ptr szHello[eax]  ;逐个取字符00409EB4 8D 40 01             lea         eax,[eax+1]               ;仅仅是让eax递增 为什么要用这句呢 是因为其他类型也适用吗 要不inc eax岂不是更快00409EB7 88 4C 05 E7          mov         byte ptr [ebp+eax-19h],cl ;逐个赋值00409EBB 84 C9                test        cl,cl                     00409EBD 75 F1                jne         main+30h (0409EB0h)  

strcpy特征 :

xor     eax,eax未知语句mov     cl,String[eax]lea     eax,[eax+1]mov     [ebp+eax-ArraryLength],cltest        cl,cljne     LoopBegin
0 0