0035135B push edi 0035135C lea edi,[ebp-160h] 00351362 mov ecx,58h 00351367 mov eax,0CCCCCCCCh 0035136C rep stos dword ptr es:[edi] 还比如程序运行完成后要清理环境:
	return 0;
00351488  xor         eax,eax  
0035148A  pop         edi  
0035148B  pop         esi  
0035148C  pop         ebx  
0035148D  mov         esp,ebp  
0035148F  pop         ebp  
00351490  ret  
--- No source file ---------------------
00351491  int         3  

这样总是给人一种分心的感觉

所以打开看看Release 版本看看也是很自然的原因。

因为main函数内部的操作对外界没有影响,所以被浓缩为下面两句话也是可以理解的:

01381000  xor         eax,eax  
01381002  ret  

但是问题却来了,怎么看编译结果呢?(在工程名后点属性,跟着蓝线紫线走)

点确定继续

再次编译,是不是比Debug版本干净多了呢?

--- d:\cpp_loves_asm\2_arithmetic\2_arithmetic.cpp -----------------------------
//    2_arithmetic.cpp
//    This is a deliberate to demonstrate how 
//        C++ and ASM as well as C are connected.
//    Mighten Dai
//    22:32
//    Jul 13, 2015
// ---Part 2: Arithmetic operations
#include <iostream>
using namespace std;
int main(void)
00FA1000  push        ebp  
00FA1001  mov         ebp,esp  
00FA1003  sub         esp,38h  
	// the unsigned integer
	unsigned int   ui_arg_1;
	unsigned int   ui_arg_2;
	unsigned int   ui_result = 0;
00FA1006  mov         dword ptr [ui_result],0  
	// the signed integer
	signed int  si_arg_1;
	signed int  si_arg_2;
	signed int  si_result = 0;
00FA100D  mov         dword ptr [si_result],0  
	// the floating point number
	float   f_arg_1;
	float   f_arg_2;
	float   f_result = 0;
00FA1014  fldz  
00FA1016  fstp        dword ptr [f_result]  
	// the others types
	long int		li_test = 0;
00FA1019  mov         dword ptr [li_test],0  
	long long int	lli_test = 0;
00FA1020  mov         dword ptr [lli_test],0  
00FA1027  mov         dword ptr [ebp-1Ch],0  
	bool			b_test = 0;
00FA102E  mov         byte ptr [b_test],0  
	char			c_test = 0;
00FA1032  mov         byte ptr [c_test],0  
	// the unsigned integer operations
	ui_arg_1 = 10;
00FA1036  mov         dword ptr [ui_arg_1],0Ah  
	ui_arg_2 = 5;
00FA103D  mov         dword ptr [ui_arg_2],5  
	ui_result = ui_arg_1 + ui_arg_2;
00FA1044  mov         eax,dword ptr [ui_arg_1]  
00FA1047  add         eax,dword ptr [ui_arg_2]  
00FA104A  mov         dword ptr [ui_result],eax  
	ui_result = ui_arg_1 - ui_arg_2;
00FA104D  mov         ecx,dword ptr [ui_arg_1]  
00FA1050  sub         ecx,dword ptr [ui_arg_2]  
00FA1053  mov         dword ptr [ui_result],ecx  
	ui_result = ui_arg_1 * ui_arg_2;
00FA1056  mov         edx,dword ptr [ui_arg_1]  
00FA1059  imul        edx,dword ptr [ui_arg_2]  
00FA105D  mov         dword ptr [ui_result],edx  
	ui_result = ui_arg_1 / ui_arg_2;
00FA1060  mov         eax,dword ptr [ui_arg_1]  
00FA1063  xor         edx,edx  
00FA1065  div         eax,dword ptr [ui_arg_2]  
00FA1068  mov         dword ptr [ui_result],eax  
	ui_result = ui_arg_1 % ui_arg_2;
00FA106B  mov         eax,dword ptr [ui_arg_1]  
00FA106E  xor         edx,edx  
00FA1070  div         eax,dword ptr [ui_arg_2]  
00FA1073  mov         dword ptr [ui_result],edx  
	// the signed integer operations
	si_arg_1 = -10;
00FA1076  mov         dword ptr [si_arg_1],0FFFFFFF6h  
	si_arg_2 = -5;
00FA107D  mov         dword ptr [si_arg_2],0FFFFFFFBh  
	si_result = si_arg_1 + si_arg_2;
00FA1084  mov         eax,dword ptr [si_arg_1]  
00FA1087  add         eax,dword ptr [si_arg_2]  
00FA108A  mov         dword ptr [si_result],eax  
	si_result = si_arg_1 - si_arg_2;
00FA108D  mov         ecx,dword ptr [si_arg_1]  
00FA1090  sub         ecx,dword ptr [si_arg_2]  
00FA1093  mov         dword ptr [si_result],ecx  
	si_result = si_arg_1 * si_arg_2;
00FA1096  mov         edx,dword ptr [si_arg_1]  
00FA1099  imul        edx,dword ptr [si_arg_2]  
00FA109D  mov         dword ptr [si_result],edx  
	si_result = si_arg_1 / si_arg_2;
00FA10A0  mov         eax,dword ptr [si_arg_1]  
00FA10A3  cdq  
00FA10A4  idiv        eax,dword ptr [si_arg_2]  
00FA10A7  mov         dword ptr [si_result],eax  
	si_result = si_arg_1 % si_arg_2;
00FA10AA  mov         eax,dword ptr [si_arg_1]  
00FA10AD  cdq  
00FA10AE  idiv        eax,dword ptr [si_arg_2]  
00FA10B1  mov         dword ptr [si_result],edx  
	// the floating point number operations
	f_arg_1 = 2.43E+7; // 2.43 times 10 to plus 7
00FA10B4  fld         dword ptr [__real@4bb964f0 (0FA20E8h)]  
00FA10BA  fstp        dword ptr [f_arg_1]  
	f_arg_2 = 1.62E-5; // 1.62 times 10 to minus 5
00FA10BD  fld         dword ptr [__real@3787e53c (0FA20E4h)]  
00FA10C3  fstp        dword ptr [f_arg_2]  
	f_result = f_arg_1 + f_arg_2;
00FA10C6  fld         dword ptr [f_arg_1]  
00FA10C9  fadd        dword ptr [f_arg_2]  
00FA10CC  fstp        dword ptr [f_result]  
	f_result = f_arg_1 - f_arg_2;
00FA10CF  fld         dword ptr [f_arg_1]  
00FA10D2  fsub        dword ptr [f_arg_2]  
00FA10D5  fstp        dword ptr [f_result]  
	f_result = f_arg_1 * f_arg_2;
00FA10D8  fld         dword ptr [f_arg_1]  
00FA10DB  fmul        dword ptr [f_arg_2]  
00FA10DE  fstp        dword ptr [f_result]  
	f_result = f_arg_1 / f_arg_2;
00FA10E1  fld         dword ptr [f_arg_1]  
00FA10E4  fdiv        dword ptr [f_arg_2]  
00FA10E7  fstp        dword ptr [f_result]  
	// the others types operations
	li_test = 3000000000;
00FA10EA  mov         dword ptr [li_test],0B2D05E00h  
	lli_test = 30000000000000;
00FA10F1  mov         dword ptr [lli_test],0EB57E000h  
00FA10F8  mov         dword ptr [ebp-1Ch],1B48h  
	b_test = 0;
00FA10FF  mov         byte ptr [b_test],0  
	b_test = 1;
00FA1103  mov         byte ptr [b_test],1  
	c_test = 'A';
00FA1107  mov         byte ptr [c_test],41h  
	return 0;
00FA110B  xor         eax,eax  
00FA110D  mov         esp,ebp  
00FA110F  pop         ebp  
00FA1110  ret  
Visual Studio 在Release模式下开启debug调试,不然 编译器 优化 变量 ,无法在调试时看到 变量 的值。如果没有调整 Visual Studio 的配置,是无法实现release版本的单步调试功能的。 在 Visual Studio 一般默认有四种编译方式: Debug, MinSizeRel, Release, RelWithDebInfo. RelWithDebInfo模式在保留Release模式下运行快速的前提下,又可以给特定的工程开启Debug模式,进行针对性的调试。这样比整个项目都采用D 这将会 关闭 "Release"模式下的 代码 优化 ,可能让你更好地进行调试。并且即使 关闭 优化 ,"Release"模式下的调试仍然可能没有"Debug"模式那么直观和有效,因为某些调试信息在"Release"模式下可能并不可用。在 Visual Studio 中,你可能不会直接看到名为"配置属性"的选项,而是会看到各种配置属性的子选项。在"生成"页面中,你可以看到一个" 优化 代码 "的选项,对于"Release"模式,这个通常是被勾选的。在弹出的属性页面中,选择 “生成” 选项。取消勾选" 优化 代码 "选项,然后保存更改。   在使用Debug模式对程序进行调试的时候,发现 变量 的值显示被 优化 了,看不到它的值,如下图所示:   解决办法就是,在 vs 顶部工具栏上,选择工具->属性,打开属性页,然后依次选择配置属性->C/ C++ -> 优化 ,将 优化 栏的值选为已禁用(/Od),然后确定保存设置就可以了。如下图所示:   修改完成后,再次运行程序,就可以正常看到每个 变量 的值了:   一般来说,上述设置的 优化 选项中,最大 优化 (优选速度)(/O2)是release版本的设置,它会在执行过程中对 代码 变量 进行 优化 ,因此, 使用 vs 运行程序时,发现不是每次运行的结果都一致,抛开多线程的因素。比方说我用openGL加载骨骼动画数据,有时候能加载出骨骼纹理,有时候就不行,很头疼,在调试问题的时候就遇见 vs 调试器报错: 变量 已被 优化 ,因而不可用 在 vs 顶部工具栏上,选择工具->属性,打开属性页,然后依次选择配置属性->C/C+±> 优化 ,将 优化 栏的值选为已禁用(/Od),然后确定保存设置就可以了。如下图所示: 一般来说,上述设置的 优化 选项中,最大 优化 (优选速度)(/O2)是releas 首先,你要确保 VS 处于调试状态(因为编辑状态和调试状态的菜单以及工具栏会不同)。 然后选择菜单【调试】-【窗口】里面的【局部 变量 】、【自动窗口】和【监视】-【监视 n】都可以显示 变量 的值,只是显示的 变量 会不同 - 优化 - /O1 最大 优化 (优选空间) /O2 最大 优化 (优选速度) /Ob 内联扩展(默认 n=0) /Od 禁用 优化 (默认) /Og 启用全局 优化 /Oi[-] 启用内部函数 /Os 优选 代码 空间 /Ot 优选 代码 速度...