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 优选
代码
速度...