vc调试的问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 03:57:02
这样的代码
int main()
{
return 0;
}
反汇编后将看到这样的代码片段:
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h;为什么这里会保留40个堆栈,我并没有定义局部变量啊?
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi];还有这里的串存储指令有什么作用呢?
00401028 xor eax,eax
0040102A pop edi
0040102B pop esi
0040102C pop ebx
0040102D mov esp,ebp
0040102F pop ebp
00401030 ret

这一堆不过是debug编译的时候编译器写进去的一大堆INT 3,省得程序跑飞了……
事实上如果是realse编译的话,这个函数一行代码也不会生成,直接被优化掉了
INT 3你知道是干什么用的吧,呵呵

嘛嘛。。Release的话 xor eax,eax这句还是会有的。。毕竟要返回值的.~~

下面是引用《天书夜读》上的一段话:
把局部变量区域初始化成0cccccccch。0cccccccch实际是INT 3.这是一个中断指令。因为局部变量不可能被执行,如果执行了必然程序有错,这时发生中断来提示开发者。这是VC编译DEBUG版本的特有操作。