我在Visual Studio中有一个C程序,我希望比较标准调试版本和速度优化版本之间的反汇编。
对于标准调试工作完美,我设置了断点,然后右键单击“Goto Dissassembly”以查看等效的汇编代码。
但是,当我尝试在启用针对速度开关优化的情况下执行此操作时,我只看到部件的组件。
我创建优化速度构建的过程是(保持在调试构建配置中):
从项目属性 - > C / C ++ - >优化更改优化从禁用/ Od优化到最大化速度/ O2并改变支持大小或速度为'偏爱快速代码/ Ot)
在代码生成下 - >基本运行时检查更改为“默认”
注意:我决定修改我的调试配置而不进行完整优化(包括大小),因为我想保留我的代码符号。
作为调查的一部分,我创建了一个简单的测试程序。这是来源:
#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的相同值。 有谁知道如何解决我的问题?