这些汇编语言语句的含义是什么?

时间:2012-01-12 00:14:49

标签: assembly

当我在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]  

4 个答案:

答案 0 :(得分:2)

该代码用模式(0xcc)填充堆栈帧。 exc包含要填充的单词数,'eax'是模式。英特尔架构rep操作码是“重复字符串操作前缀”。最有可能的是样板代码在一个完整的函数中有意义(可能清除局部变量,为未初始化的变量创建故意的坏数据)。这里堆栈框架在退出时立即销毁,代码无用。

无需担心。

答案 1 :(得分:2)

在Debug版本中,Visual C ++编译器使用0xCC模式填充为局部变量分配的堆栈空间,以便在调试时可以轻松识别未初始化的变量。编译器和/或操作系统使用其他一些神奇的值来帮助调试;在维基百科上查看this list

我不确定为什么编译器决定在这个函数中分配堆栈空间;可能它是特定于处理main函数的东西。

答案 2 :(得分:1)

它们是一些在Debug版本中启用的冗余代码。它看起来像是一些错误检查。它们不会在发布版本中发出。

答案 3 :(得分:0)

在我看来,当程序终止时,它正在写入堆栈...这是一种安全预防措施,以防任何敏感数据留在那里作为垃圾。

编辑:正如评论所指出的那样,这似乎是在设置代码中,所以这可能不是原因(我怀疑它是出于调试目的)。但是我在这里留下了答案供参考,因为它在其他情况下可能仍然有用。