看看以下代码:
void f()
{
}
我在Visual Studio 2013中编译了这个,调试,32位模式并查看了反汇编。
void f()
{
00304CB0 push ebp
00304CB1 mov ebp,esp
00304CB3 sub esp,0C0h
00304CB9 push ebx
00304CBA push esi
00304CBB push edi
00304CBC lea edi,[ebp-0C0h]
00304CC2 mov ecx,30h
00304CC7 mov eax,0CCCCCCCCh
00304CCC rep stos dword ptr es:[edi]
}
00304CCE pop edi
00304CCF pop esi
00304CD0 pop ebx
00304CD1 mov esp,ebp
00304CD3 pop ebp
00304CD4 ret
rep stos指令的目的是什么?
我只是好奇。
答案 0 :(得分:7)
rep stos
指令将eax
中的值写入edi
(本例中为您的本地堆栈)指向的地址,ecx
(0x30)次。 eax
中的值为0xcccccccc
,这是由microsoft选择的幻数,表示未初始化的内存。如果您尝试从该内存中取消引用指针,调试器将捕获您。 /RTCu
选项启用了额外的诊断检查。
现在你可能会问为什么,在一个空的函数体中,任何内存都将保留在本地堆栈上。这是因为您已使用/ZI
选项进行编辑并继续启用。编译器只是留出一些空间,以防你决定在调试会话中使用它。