如何在Visual Studio

时间:2017-02-22 11:46:37

标签: visual-studio visual-studio-2010 assembly visual-c++ visual-studio-2015

我在Visual Studio中有一个C程序,我希望比较标准调试版本和速度优化版本之间的反汇编。

对于标准调试工作完美,我设置了断点,然后右键单击“Goto Dissassembly”以查看等效的汇编代码。

但是,当我尝试在启用针对速度开关优化的情况下执行此操作时,我只看到部件的组件。

我创建优化速度构建的过程是(保持在调试构建配置中):

  1. 从项目属性 - > C / C ++ - >优化更改优化从禁用/ Od优化到最大化速度/ O2并改变支持大小或速度为'偏爱快速代码/ Ot)

  2. 在代码生成下 - >基本运行时检查更改为“默认”

  3. 注意:我决定修改我的调试配置而不进行完整优化(包括大小),因为我想保留我的代码符号。

    作为调查的一部分,我创建了一个简单的测试程序。这是来源:

    #include<stdio.h>
    
    int main()
    {
        int x = 0;
        int y = 0;
        printf("The value of x is %d\n", x);
        while (1)
        {
            ++x;
            if (x > 1000000)
               break;
        }
        y = x;
        printf("The value of y is %d\n", y);
        return 0;
    }
    

    在完全调试模式下,这是我的反汇编:注意:我可以很容易地看到WHILE LOOP中发生了什么

    int x = 0;
    00CF1779  mov         dword ptr [x],0  
    int y = 0;
    00CF1780  mov         dword ptr [y],0  
    printf("The value of x is %d\n", x);
    00CF1787  mov         eax,dword ptr [x]  
    00CF178A  push        eax  
    00CF178B  push        offset string "The value of x is %d\n" (0CF6B30h)  
    00CF1790  call        _printf (0CF1320h)  
    00CF1795  add         esp,8  
    while (1)
    00CF1798  mov         eax,1  
    00CF179D  test        eax,eax  
    00CF179F  je          main+47h (0CF17B7h)  
    {
        ++x;
    00CF17A1  mov         eax,dword ptr [x]  
    00CF17A4  add         eax,1  
    00CF17A7  mov         dword ptr [x],eax  
        if (x > 1000000)
    00CF17AA  cmp         dword ptr [x],0F4240h  
    00CF17B1  jle         main+45h (0CF17B5h)  
            break;
    00CF17B3  jmp         main+47h (0CF17B7h)  
    }
    00CF17B5  jmp         main+28h (0CF1798h)  
    y = x;
    00CF17B7  mov         eax,dword ptr [x]  
    00CF17BA  mov         dword ptr [y],eax  
    printf("The value of y is %d\n", y);
    00CF17BD  mov         eax,dword ptr [y]  
    00CF17C0  push        eax  
    00CF17C1  push        offset string "The value of y is %d\n" (0CF6BE8h)  
    00CF17C6  call        _printf (0CF1320h)  
    00CF17CB  add         esp,8  
    
    return 0;
    

    以下是优化速度构建的反汇编 - 请注意,没有显示while循环例程的代码

    int x = 0;
    int y = 0;
    printf("The value of x is %d\n", x);
    00EE16F0  push        0  
    00EE16F2  push        offset string "The value of x is %d\n" (0EE6B30h)  
    00EE16F7  call        _printf (0EE1320h)  
    while (1)
    {
        ++x;
        if (x > 1000000)
            break;
    }
    y = x;
    printf("The value of y is %d\n", y);
    00EE16FC  push        0F4241h  
    00EE1701  push        offset string "The value of y is %d\n" (0EE6BE8h)   
    00EE1706  call        _printf (0EE1320h)  
    00EE170B  add         esp,10h  
    
    return 0;
    00EE170E  xor         eax,eax  
    }
    00EE1710  ret
    

    两个构建在printf语句中输出x和y的相同值。 有谁知道如何解决我的问题?

0 个答案:

没有答案