来自 Visual Studio 的此代码中的 rep stos 程序集命令的目的

Purpose of rep stos assembly command in this code from Visual Studio

本文关键字:程序集 stos 命令 rep 代码 Visual Studio 来自      更新时间:2023-10-16

看看下面的代码:

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 指令以eax形式写入值,从 edi 指向的地址(在本例中为本地堆栈(开始,ecx (0x30( 次。eax 中的值是 0xcccccccc这是 Microsoft 选择的用于指示未初始化内存的幻数。如果您尝试从此内存中取消引用指针,调试器将捕获您。此额外的诊断检查由/RTCu选项启用。

现在你可能会问,为什么在函数体为空的情况下,任何内存都会保留在本地堆栈上。这是因为您已使用/ZI选项打开了编辑并继续。编译器只是留出一些空间,以防您决定在调试会话中使用它。