当我在Disassembly中查看一些c代码时,我发现了一些奇怪的陈述。这些语句发生在调用函数之前。所以我从程序中删除了所有代码,只留下一个空的主函数 -
我有一个像这样的空主函数 -
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
然而,当我查看反汇编时,相关的汇编语句仍然存在。那么有谁知道这些陈述是为了什么?
int _tmain(int argc, _TCHAR* argv[])
{
00411350 push ebp
00411351 mov ebp,esp
00411353 sub esp,0C0h
00411359 push ebx
0041135A push esi
0041135B push edi
0041135C lea edi,[ebp-0C0h]
00411362 mov ecx,30h
00411367 mov eax,0CCCCCCCCh
0041136C rep stos dword ptr es:[edi]
return 0;
0041136E xor eax,eax
}
有问题的陈述是
00411362 mov ecx,30h
00411367 mov eax,0CCCCCCCCh
0041136C rep stos dword ptr es:[edi]
答案 0 :(得分:2)
该代码用模式(0xcc)填充堆栈帧。 exc
包含要填充的单词数,'eax'是模式。英特尔架构rep
操作码是“重复字符串操作前缀”。最有可能的是样板代码在一个完整的函数中有意义(可能清除局部变量,为未初始化的变量创建故意的坏数据)。这里堆栈框架在退出时立即销毁,代码无用。
无需担心。
答案 1 :(得分:2)
在Debug版本中,Visual C ++编译器使用0xCC模式填充为局部变量分配的堆栈空间,以便在调试时可以轻松识别未初始化的变量。编译器和/或操作系统使用其他一些神奇的值来帮助调试;在维基百科上查看this list。
我不确定为什么编译器决定在这个函数中分配堆栈空间;可能它是特定于处理main
函数的东西。
答案 2 :(得分:1)
它们是一些在Debug版本中启用的冗余代码。它看起来像是一些错误检查。它们不会在发布版本中发出。
答案 3 :(得分:0)
在我看来,当程序终止时,它正在写入堆栈...这是一种安全预防措施,以防任何敏感数据留在那里作为垃圾。
编辑:正如评论所指出的那样,这似乎是在设置代码中,所以这可能不是原因(我怀疑它是出于调试目的)。但是我在这里留下了答案供参考,因为它在其他情况下可能仍然有用。