Visual Studio中此代码中的rep stos程序集命令的用途

Nei*_*irk 2 c++ assembly

看看下面的代码:

void f()
{
}
Run Code Online (Sandbox Code Playgroud)

我在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  
Run Code Online (Sandbox Code Playgroud)

rep stos指令的目的是什么?

我只是好奇.

jak*_*ket 7

rep stos指令将值写入eaxedi(本例中为本地堆栈),ecx(0x30)次指向的地址开始.值in eax0xcccccccc由microsoft选择的幻数,表示未初始化的内存.如果您尝试从该内存中取消引用指针,调试器将捕获您./RTCu选项启用此额外诊断检查.

现在您可能会问为什么,使用空函数体,将在本地堆栈上保留任何内存.这是因为您已使用该/ZI选项进行编辑并继续打开.如果您决定在调试会话中使用它,编译器只是留出一些空间.