VS2015对除法的优化

O2

int main(int argc, char* argv[])
{
00411D20 55                   push        ebp  
00411D21 8B EC                mov         ebp,esp  
    printf("%d", argc / 9);
00411D23 B8 39 8E E3 38       mov         eax,38E38E39h 
; 38E38E39h即魔幻数 将除法变为乘法的神奇力量。
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B D1 FA                sar         edx,1  
;edx 存放的高32位,再加上有符号移一位,相当于右移3300411D2D 8B C2                mov         eax,edx  
00411D2F C1 E8 1F             shr         eax,1Fh  
00411D32 03 C2                add         eax,edx  
;这里是为了得到符号位
00411D34 50                   push        eax  
00411D35 68 D0 6B 41 00       push        offset string "%d" (0416BD0h)  
00411D3A E8 1D F6 FF FF       call        _printf (041135Ch)  
00411D3F 83 C4 08             add         esp,8  
    return 0;
00411D42 33 C0                xor         eax,eax  
}
argc/2
00411D23 8B 45 08             mov         eax,dword ptr [argc]  
00411D26 99                   cdq  
00411D27 2B C2                sub         eax,edx  
00411D29 D1 F8                sar         eax,1  
argc/3
00411D23 B8 56 55 55 55       mov         eax,55555556h  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B 8B C2                mov         eax,edx  
00411D2D C1 E8 1F             shr         eax,1Fh  
00411D30 03 C2                add         eax,edx  
argc/4
00411D23 8B 45 08             mov         eax,dword ptr [argc]  
00411D26 99                   cdq  
00411D27 83 E2 03             and         edx,3 
00411D2A 03 C2                add         eax,edx  
;这两句是为了保持符号地
00411D2C C1 F8 02             sar         eax,2  
argc/5
00411D23 B8 67 66 66 66       mov         eax,66666667h  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B D1 FA                sar         edx,1  
argc/6
00411D23 B8 AB AA AA 2A       mov         eax,2AAAAAABh  
00411D28 F7 6D 08             imul        dword ptr [argc] 
argc/7
00411D23 B8 93 24 49 92       mov         eax,92492493h  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B 03 55 08             add         edx,dword ptr [argc]  
00411D2E C1 FA 02             sar         edx,2  
argc/8
00411D23 8B 45 08             mov         eax,dword ptr [argc]  
00411D26 99                   cdq  
00411D27 83 E2 07             and         edx,7  
00411D2A 03 C2                add         eax,edx  
00411D2C C1 F8 03             sar         eax,3  
argc/9
00411D23 B8 39 8E E3 38       mov         eax,38E38E39h 
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B D1 FA                sar         edx,1  
argc/10
00411D23 B8 67 66 66 66       mov         eax,66666667h  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B C1 FA 02             sar         edx,2  
argc/11
00411D23 B8 E9 A2 8B 2E       mov         eax,2E8BA2E9h  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B D1 FA                sar         edx,1 
argc/12
00411D23 B8 AB AA AA 2A       mov         eax,2AAAAAABh  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B D1 FA                sar         edx,1  
argc/13
00411D23 B8 4F EC C4 4E       mov         eax,4EC4EC4Fh  
00411D28 F7 6D 08             imul        dword ptr [argc]  
00411D2B C1 FA 02             sar         edx,2  

你可能感兴趣的:(读书笔记)